Inheritance With Modules
In the rewrite of
I became enamored with the
util.inherits pattern. With Browserify,
it works on the server and in the browser. I’m a little late to the party. Several other libraries
I follow already use this pattern and for good reason.
While watching Eric Elliot’s video excellent presentation on the subject of modules,
one thing didn’t jive with me– “Don’t Export Constructors” (10:06 in the video). The suggestion to only export
factories because it forces code consumers to use the
new operator and prevents factory abstractions
later seemed a little heavy-handed. I tried to do another refactor of
svg-clock where the
module exports a factory. But because I used an object pool on the constructor, my code broke.
To preserve the ability for module consumers to extend constructors, I want to modify that advice to,
“Export instances or constructors with factories”. I just added a feature to
perfget which I plan to use often. I created an empty constructor
function and exported an instance of the constructor. This allows module consumers to inherit the
method in their own constructors using
util.inherits( MyConstructor, perfget.constructor ).
For modules needing more initialization, you might consider exporting a constructor with a static
.create() method. The module consumer can avoid the
new operator with
var factory = require( 'Module' ).factory and yet retains the power of
util.inherits( fn, Module ).
Update: I figured I should support other patterns for inheritance, so I updated perfget to 0.2.1 to support Object.create. This time, I used a factory to generate a clean instance from the constructor I added under the hood in 0.2.0. This means that my old API did not change, I just have another (better?) way to include perfget’s the functionality.
While trying to publish, I kept getting
EPUBLISHCONFLICT errors. After updating npm,
npm install npm -g
I was able to publish again.