Set event listeners in ES6 class definition that extends EventEmitter
You cannot avoid registering the listeners separately for every instance, and the natural place to do that is in the constructor1, 2. However, you can avoid creating new listener functions:
class Cat extends EventEmitter {
constructor() {
super();
this.on('wave', this.onWave);
}
onWave() {
console.log('prototype wave');
}
}
var cat = new Cat();
cat.emit('wave');
1: There are other ways, like a getter for ._events
. You could do all kinds of fancy stuff with that, including prototypical inheritance for "default" listeners, but those are totally overcomplicated and get over your head quickly. You can do fancy things as well - and much cleaner - by just putting some generic code in the constructor.
2: You could also override (specialise) the init
method of EventEmitters, but it comes down to exactly the same.
flori
Updated on July 25, 2022Comments
-
flori almost 2 years
I want some predefined custom listeners, that are defined already with the definition of the class (like the build in
'newListner'
event). So I don't want to just bind them in the constructor because it would be executed on every new instance of that class.How to do this? Modify the prototype? Is it possible at all?
What I have so far:
class Cat extends EventEmitter { // just added for demonstration, I don't want this! constructor() { super(); // does fire this.on('wave', function() { console.log('constructor wave'); }); } } // compiles but does not fire Cat.prototype.on('wave', function() { console.log('prototype wave'); }); var cat = new Cat(); cat.emit('wave');
-
Bergi about 8 years
Cat.prototype
isinstanceof EvenEmitter
, and you could theoretically doCat.prototype.emit('wave')
, but you're right that it doesn't make any sense. -
nils about 8 yearsThank you for clarifying.
Cat.prototype.emit('wave')
doesn't seem to work, so I assumed there are things happening in theEventEmitter
constructor that are necessary for it to work (which is only called when a newCat
intance is created). Is that correct? -
Bergi about 8 yearsLast time I checked it was not necessary to invoke the constructor (but the best practise, of course),
on
andemit
calls would initialise the object themselves if it hasn't happened yet. -
nils about 8 yearsThank you, that makes sense.