在 Node.js 中使对象实例可见

Making object instances observable in 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 这个模块并创建实例,这些实例都是 'observable' 因为它们的事件可以将数据传递给将处理这些事件的其他对象。

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

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

重点是:

调用 method1 抛出错误:

TypeError: undefined is not a function

其堆栈跟踪指向 emit 调用。

问题

这应该是一个单例 class 以实现 Observable 行为,还是有一些微妙的东西可以让实例发出可以在别处处理的事件?

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

您将 MyClass 的原型分配给了一个全新的对象,这完全颠覆了它,所以难怪 emitundefined。试试这个:

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

应该可以。

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