请考虑以下事项:
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
此模块并创建所有“可观察”的实例,因为它们的事件可以将数据传递给将处理这些事件的其他对象。
我像这样使用这个模块:
var MyClass = require('./my-module-index');
var instance = new MyClass();
instance.method1();
这是捕获:
调用method1
会引发错误:
TypeError: undefined is not a function
其堆栈跟踪指向emit
调用。
这应该是一个单独的类来实现Observable行为,还是有一些微妙的东西可以让实例发出可以在其他地方处理的事件?
我通常认为这是一个范围问题,但由于该方法是在Object的原型上,this
应该引用任何实例(使用提供的new
)。
答案 0 :(得分:3)
通过将MyClass
分配给一个全新的对象,您完全放弃了原型,所以难怪emit
是undefined
。试试这个:
MyClass.prototype.method1 = function() {
this.emit('method1');
};
这应该有效。
Here is a good write up on MDN关于原型链以及方法查找/继承如何在JavaScript中工作。