向一个对象添加一个事件侦听器也会将它添加到它的所有兄弟姐妹中
Adding an event listener to an object adds it too all its siblings
向对象添加事件意外地向其所有兄弟对象添加了相同的事件,即从相同构造函数创建的对象。
这是一个简单的代码来演示这一点:
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 ???
为什么会发生这种情况,如何让每个对象维护自己的事件集?
您用于继承的方法有问题EventEmitter
。
Person.prototype = new EventEmitter();
它调用 events.EventEmitter
可能有副作用的构造函数。例如
console.log(Person.prototype.constructor === EventEmitter); // prints true
考虑使用以下内容从 EventEmitter
继承 Person
。
var util = require('util');
util.inherits(Person, EventEmitter);
它使用 Object.create
,它没有按照 here
的解释调用构造函数
向对象添加事件意外地向其所有兄弟对象添加了相同的事件,即从相同构造函数创建的对象。
这是一个简单的代码来演示这一点:
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 ???
为什么会发生这种情况,如何让每个对象维护自己的事件集?
您用于继承的方法有问题EventEmitter
。
Person.prototype = new EventEmitter();
它调用 events.EventEmitter
可能有副作用的构造函数。例如
console.log(Person.prototype.constructor === EventEmitter); // prints true
考虑使用以下内容从 EventEmitter
继承 Person
。
var util = require('util');
util.inherits(Person, EventEmitter);
它使用 Object.create
,它没有按照 here