构造函数用作事件发射器

时间:2012-11-07 07:21:17

标签: javascript oop node.js events

我想为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语言相似的类方法的东西。

2 个答案:

答案 0 :(得分: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之类的内容提供此行为的替代路由,那么出于合规性原因,这当然更可取。

答案 1 :(得分: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!!!

```