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