Javascript 如何让类构造函数在nodejs中创建新实例时发出事件
我有一个班级,我的班级:Javascript 如何让类构造函数在nodejs中创建新实例时发出事件,javascript,node.js,eventemitter,Javascript,Node.js,Eventemitter,我有一个班级,我的班级: var MyClass = function(){ events.EventEmitter.call(this); //... }; util.inherits(MyClass, EventEmitter); 我希望每次创建MyClass的新实例时,它都会发出一个“new”事件: myClassInstance = new MyClass(); // emit a 'new' event from MyClass, not myClassInstance 我
var MyClass = function(){
events.EventEmitter.call(this);
//...
};
util.inherits(MyClass, EventEmitter);
我希望每次创建MyClass的新实例时,它都会发出一个“new”事件:
myClassInstance = new MyClass(); // emit a 'new' event from MyClass, not myClassInstance
我想这样做,以便在每次创建MyClass的新实例时,都能有一个观察者来做一些事情。例如:
var MyClass = require('myclass');
MyClass.on('new', function(newInstance) {
// do something with the new instance of MyClass
};
有办法吗?您有两种选择:
第一种方法是不从MyClass发射,而是创建一个新的EventEmitter实例来发射
var MyClassEmitter = new events.EventEmitter();
var MyClass = function(){
MyClassEmitter.emit('new', this);
};
这是我会做的,因为它使用最少的幻想,不太可能打破
第二种方法是,直接使用MyClass
,您需要将EventEmitter行为混合到构造函数中
var MyClass = function(){
MyClass.emit('new', this);
};
// Mix functions directly onto function.
Object.keys(events.EventEmitter.prototype).forEach(function(prop){
MyClass[prop] = events.EventEmitter.prototype[prop];
});
// Trigger constructor in MyClass context.
events.EventEmitter.call(MyClass);
您有两个选择:
第一种方法是不从MyClass发射,而是创建一个新的EventEmitter实例来发射
var MyClassEmitter = new events.EventEmitter();
var MyClass = function(){
MyClassEmitter.emit('new', this);
};
这是我会做的,因为它使用最少的幻想,不太可能打破
第二种方法是,直接使用MyClass
,您需要将EventEmitter行为混合到构造函数中
var MyClass = function(){
MyClass.emit('new', this);
};
// Mix functions directly onto function.
Object.keys(events.EventEmitter.prototype).forEach(function(prop){
MyClass[prop] = events.EventEmitter.prototype[prop];
});
// Trigger constructor in MyClass context.
events.EventEmitter.call(MyClass);
阅读Mongoose源代码时,我在他们的model.js中发现了这一点:for(EventEmitter.prototype中的var I)model[I]=EventEmitter.prototype[I];这和你的第二种方法是一样的吗?差不多,是的
Object.keys…
与(EventEmitter.prototype中的var i)的相同,如果(EventEmitter.prototype.hasOwnProperty(i))模型[i]=EventEmitter.prototype[i]代码>。实际上,没有hasOwnProperty的for循环可能会更好,但这两种方法都会起作用。阅读Mongoose源代码,我在他们的model.js中发现了这一点:for(EventEmitter.prototype中的var I)model[I]=EventEmitter.prototype[I];这和你的第二种方法是一样的吗?差不多,是的Object.keys…
与(EventEmitter.prototype中的var i)的相同,如果(EventEmitter.prototype.hasOwnProperty(i))模型[i]=EventEmitter.prototype[i]代码>。实际上,没有hasOwnProperty的for循环可能会更好,但这两种方法都可以工作。