为了形成事件真正去做哪些对象?

时间:2014-09-08 18:09:48

标签: javascript node.js events javascript-events eventemitter

我试图了解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

1 个答案:

答案 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实例都会初始化自己的发射器(即使由addListeneremit自动完成,it's still a good thing to do)。