2015-02-12 31 views
0

將事件添加到對象意外地將同一事件添加到其所有同級,即從同一構造函數創建的對象。向對象添加事件偵聽器也會將其全部添加到對象中

下面是一個簡單的代碼來說明這一點:

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

不調用構造函數?在v0.12.0中,它似乎按預期工作。 – DeadAlready 2015-02-12 08:03:29

回答

1

您用於繼承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

相關問題