0

我想为我在 node.js 中做的一些工作编写一个构造函数。除其他外,我想记录它使用事件发射器创建的实例数。目前,我通过给构造函数对象一个作为事件发射器的方法来做到这一点。例如:

var EventEmitter = require('events').EventEmitter;

function MyObject() {
    ...
    MyObject.events.emit('createdMyObject')
}

MyObject.events = new EventEmitter();

/* somewhere else... */

MyObject.events.on('createdMyObject', function () {
    // Do something when a new instance is created.
});

我真正喜欢的是构造函数更直接地发出事件,所以我可以用类似的东西来监听它们:

MyObject.on('createdMyObject', function () {
    // Do something when a new instance is created.
});

有没有办法做到这一点?

请注意,我不需要这些实例是事件发射器(当你用谷歌搜索时,有很多这样的例子)。我想要一些其他 OO 语言中与类方法等效的东西。

4

3 回答 3

2

你不能只是别名events.onon?:

// Note: can't use simple function assignment because we need
// the "this" inside on to point to events instead of MyObject

MyObject.on = function (eventType,callback) {
    MyObject.events.on(eventType,callback);
}

它并没有摆脱 MyObjects.events ,而只是提供了一种添加事件处理程序的替代方法。


附加答案

如果你真的想让你的对象成为一个事件发射器,也许你想要的是从一个 EventEmitter 对象继承?如果是这样,只需进行常规继承:

function MyObject() {
    /*
     * MyObject specific stuff here
     */

    this.emit('createdMyObject');
}

// Now we inherit from an EventEmitter object:
MyObject.prototype = Object.create(EventEmitter.prototype);
于 2012-11-07T07:28:41.847 回答
1

这是使用构造函数的非标准(但显然很常用)__proto__属性来解决的。例如:

var EventEmitter = require('events').EventEmitter;

MyObj = function (a) {
    this.a = a;
    MyObj.emit('new')
}

MyObj.__proto__ = EventEmitter.prototype;

MyObj.on('new', function () {
    console.log('A new myObj was constructed.');
});

var myObj = new MyObj(1);

预期的{ a: 1 }对象被创建,创建事件触发console.log!如果有人可以使用类似的东西提供这种行为的替代途径Object.create,那么出于合规性原因,这当然是可取的。

于 2012-11-22T17:29:07.637 回答
0

这是示例,如何构造作为事件发射器的对象

https://github.com/vodolaz095/kabam-kernel/blob/master/index.js#L17

```

var EventEmitter = require('events').EventEmitter,

function KabamKernel(config) {
  EventEmitter.call(this);
  //a lot of code
}
//a lot of code    
util.inherits(KabamKernel, EventEmitter);
//a lot of code

var kernel = new kabamKernel(configOj);
kernel.on('error',console.error); //kernel is an event emmiter!!!

```

于 2013-11-05T07:14:07.387 回答