在实例上添加事件侦听器,而不是函数

时间:2014-10-18 19:19:08

标签: node.js eventemitter

见下面的例子。我试图在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()创建一个?

1 个答案:

答案 0 :(得分: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');

这是npm上的大多数模块和节点核心中的对象用来从另一个对象继承的设置。