在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
的原型分配给一个全新的对象,您完全没有了原型,所以毫无疑问, emit
是undefined
。 试试这个:
MyClass.prototype.method1 = function() { this.emit('method1'); };
这应该工作。
下面是关于原型链的MDN的一个很好的写法,以及如何在JavaScript中查找/inheritance方法。