向一个对象添加一个事件侦听器也会将它添加到它的所有兄弟姐妹中

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

的解释调用构造函数