2014-10-18 2 views
0

См. Пример ниже. Я пытаюсь вызвать событие на a.Добавление прослушивателя событий на экземпляр, а не на функцию

var events = require("events"); 

function foo() { 
    this.on("ping", function() { 
     console.log("bar!"); 
    }) 
} 

foo.prototype = new events.EventEmitter(); 
var a = new foo(); 
var b = new foo(); 
a.emit("ping"); 

Это печатает "бар!" два раза, поэтому я предполагаю, что я добавляю слушателя событий на «все» функции, а не конкретный экземпляр. Поскольку я бегу foo два раза, я добавляю двух слушателей событий, ничего странного, хотя это не так интуитивно.

Есть ли способ добавить слушателя событий только на a?

(Пожалуйста, измените этот вопрос, если я использую неправильную терминологию, используемую для программирования на основе классов)

редактировать: Так что я подозреваю, что это потому, что я использую тот же излучатель событий как прототип .. Но в этом случае, как я могу создать один для каждого нового foo()?

+0

Возможно, это [статья об EventEmitter] (http://blog.ashworth.in/how-to-use-the-node-js-eventemitter/) поможет вам? –

ответ

1

Обычно вы унаследовали (от EventEmitter), как это:

var inherits = require('util').inherits, 
    EventEmitter = require('events').EventEmitter; 

function Foo() { 
    if (!(this instanceof Foo)) 
    return new Foo(); 

    EventEmitter.call(this); 

    this.on('ping', function() { 
    console.log('bar!'); 
    }); 
} 
inherits(Foo, EventEmitter); 

// add Foo-specific prototype functions *after* `inherits()` 
Foo.prototype.myfunc = function(a, b) { 
    return a + b; 
}); 

var a = new Foo(); 
var b = new Foo(); 
a.emit('ping'); 

Это установка, что большинство модулей по НОМУ и объектам в основном использовании узла, чтобы наследовать от другого объекта.

+0

Вместо того, чтобы просто блок кода без описания, можете ли вы описать, что оперативно отличается между вашим кодом и кодом OP? OP устанавливает прототип как EventEmitter. – jfriend00

+0

OP уже указывал на главную проблему с их кодом: 'Так что я подозреваю, что это потому, что я использую тот же самый эмитент событий как прототип. Но в этом случае, как я могу создать его для каждого нового foo()' – mscdex