向对象添加事件会意外地将同一事件添加到其所有兄弟节点,即从同一构造函数创建的对象。
这是一个简单的代码来证明这一点:
var EventEmitter = require('events').EventEmitter
function Person() {
EventEmitter.call(this)
}
Person.prototype = new EventEmitter()
Person.prototype.talk = function() {
this.emit('talking')
}
var a = new Person()
var b = new Person()
a.on('talking', function() {
console.log("a is talking")
})
a.talk() // Prints "a is talking" (expected)
b.talk() // Also prints "a is talking" ??? why ???
为什么会发生这种情况?如何让每个对象维护自己的一组事件?
答案 0 :(得分:1)
您用于继承EventEmitter
的方法存在问题。
Person.prototype = new EventEmitter();
它调用可能有副作用的events.EventEmitter
构造函数。例如
console.log(Person.prototype.constructor === EventEmitter); // prints true
考虑使用以下内容从Person
继承EventEmitter
。
var util = require('util');
util.inherits(Person, EventEmitter);
它使用Object.create
,它不会像解释here