在Node.js中使对象实例可观察

背景

考虑以下:

var EventEmitter = require('events').EventEmitter; var util = require('util'); function MyClass() { EventEmitter.call(this); } util.inherits(MyClass, EventEmitter); MyClass.prototype = { method1: function() { this.emit('method1'); } } module.exports = MyClass; 

这里的目标是require这个模块,并创build所有“可观察”的实例,因为它们的事件可以将数据传递给处理这些事件的其他对象。

我使用这个模块是这样的:

 var MyClass = require('./my-module-index'); var instance = new MyClass(); instance.method1(); 

这里有一个问题:

调用method1引发错误:

TypeError: undefined is not a function

其堆栈跟踪指向emit呼叫。

这应该是一个单例类,以实现可观察的行为,还是有一些微妙的事情,让实例发出事件,可以在其他地方处理?

我通常会认为这是一个范围问题,但由于该方法在对象的原型上, this应该指任何实例(提供了new的)。

通过将MyClass的原型分配给一个全新的对象,您完全没有了原型,所以毫无疑问, emitundefined 。 试试这个:

 MyClass.prototype.method1 = function() { this.emit('method1'); }; 

这应该工作。

下面是关于原型链的MDN的一个很好的写法,以及如何在JavaScript中查找/inheritance方法。