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

时间:2015-03-11 13:23:22

标签: javascript node.js eventemitter

背景

请考虑以下事项:

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)。

1 个答案:

答案 0 :(得分:3)

通过将MyClass分配给一个全新的对象,您完全放弃了原型,所以难怪emitundefined。试试这个:

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

这应该有效。

Here is a good write up on MDN关于原型链以及方法查找/继承如何在JavaScript中工作。