我试图了解Node.js中的EventEmitter模块。阅读apidoc at nodejs.org告诉我们:
然后可以将函数附加到对象,以便在执行时执行 事件被发出。这些函数称为侦听器。里面一个 监听器功能,这是指监听器的EventEmitter 附在。
问题是,当我玩这个时,我会发现,根据我的理解,它并不遵循文档。
var events = require('events');
function Person(nameInput){
this.name = nameInput;
this.sayMyName = function(preString){
console.log(preString + this.name);
}
}
Person.prototype = new events.EventEmitter();
var person1 = new Person("James");
var person2 = new Person("Daniel");
person1.addListener('sayit', function(){
this.sayMyName("Hello ");
});
person2.addListener('sayit', function(){
this.sayMyName("Hi ");
});
person1.emit('sayit');
//console prints out:
Hello James
Hi James
我的问题是。鉴于文档说this refers to the EventEmitter that the listener was attached to
(在我的情况下,person1和person2),不应该是程序的输出:
Hello James
Hi Daniel
答案 0 :(得分:1)
如果您为所有EventEmitter
个实例初始化(确切地说)Person
,则会出现问题:
Person.prototype = new events.EventEmitter();
这将只创建一个在所有实例中共享的侦听器存储 - 就像原型应该工作一样。另请参阅What is the reason to use the 'new' keyword at Derived.prototype = new Base。
要使继承正确,您需要执行
function Person(nameInput){
events.EventEmitter.call(this);
this.name = nameInput;
}
Person.prototype = Object.create(events.EventEmitter.prototype);
这不是为原型创建 EventEmitter
,而只是从它继承。然后,每个Person
实例都会初始化自己的发射器(即使由addListener
或emit
自动完成,it's still a good thing to do)。