在 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
的原型分配给了一个全新的对象,这完全颠覆了它,所以难怪 emit
是 undefined
。试试这个:
MyClass.prototype.method1 = function() {
this.emit('method1');
};
应该可以。
Here is a good write up on MDN 关于原型链以及方法查找/继承在 JavaScript 中的工作原理。
背景
考虑以下几点:
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
的原型分配给了一个全新的对象,这完全颠覆了它,所以难怪 emit
是 undefined
。试试这个:
MyClass.prototype.method1 = function() {
this.emit('method1');
};
应该可以。
Here is a good write up on MDN 关于原型链以及方法查找/继承在 JavaScript 中的工作原理。