向对象添加事件侦听器也会将其所有兄弟节点添加到其中

时间:2015-02-12 07:37:06

标签: node.js events

向对象添加事件会意外地将同一事件添加到其所有兄弟节点,即从同一构造函数创建的对象。

这是一个简单的代码来证明这一点:

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 ???

为什么会发生这种情况?如何让每个对象维护自己的一组事件?

1 个答案:

答案 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

那样调用构造函数