EventEmitter in particular but really any object in general, you need to do two things:
- provide a constructor for your object, which completely initializes the object; in the case that you’re inheriting from some other object, you probably want to delegate some of this initialization work to the super constructor.
- provide a prototype object that will be used as the [[proto]] for objects created from your constructor; in the case that you’re inheriting from some other object, you probably want to use an instance of the other object as your prototype.
In many cases, you can get away with doing a subset of what’s correct, and you’ll find tons of examples to follow that seem to work fine for your case.
For the specific case of Node.js’s
EventEmitter, here’s what works:
- If you set the prototype for your subclass (Master.prototype), with or without using
util.inherits, but don’t call the super constructor (
EventEmitter) for instances of your class, they won’t be properly initialized.
- If you call the super constructor but don’t set the prototype,
EventEmittermethods won’t work on your object
- You might try to use an initialized instance of the superclass (
new EventEmitter) as
Master.prototypeinstead of having the subclass constructor Master call the super constructor
EventEmitter; depending on the behavior of the superclass constructor that might seem like it’s working fine for a while, but is not the same thing (and won’t work for
- You might try to use the super prototype directly (
Master.prototype = EventEmitter.prototype) instead of adding an additional layer of object via Object.create; this might seem like it’s working fine until someone monkeypatches your object Master and has inadvertently also monkeypatched
EventEmitterand all its other descendants. Each “class” should have its own prototype.
Again: to inherit from
EventEmitter (or really any existing object “class”), you want to define a constructor that chains to the super constructor and provides a prototype that is derived from the super prototype.