Uncle Bob is a proponent of inversion of control to counter what he defines as "bad design":
There is one set of criteria that I think all engineers will agree with. A piece of software that fulﬁlls its requirements and yet exhibits any or all of the following three traits has a bad design. 1. It is hard to change because every change affects too many other parts of the system. (Rigidity) 2. When you make a change, unexpected parts of the system break. (Fragility) 3. It is hard to reuse in another application because it cannot be disentangled from the current application. (Immobility) ... What is it that makes a design rigid, fragile and immobile? It is the interdependence of the modules within that design.
One solution to standardise the interfaces of modules (or classes) is dependency injection. Vojta Jina has put together a powerful, lightweight dependency injection library for node.js. Its example is testament to its simplicity:
Martin Fowler has more to say on the benefits of Dependency Injection.