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循环可能会更好,但这两种方法都可以工作。