我是学习节点:
查看EventEmitter,默认情况下它通过将发射器作为 this 传递给事件监听器来执行回调,这样在事件监听器函数中, this 指的是EventEmitter对象。
我对这种情绪感到有些困惑,一个对象如何将自己注册为一个监听器并保持对其自身属性的引用?
考虑一下这个问题:
Meeting.prototype.recordStatement = function(name, statement) {
this.minutes.push(name + " said " + statement);
};
使用这样的模式为自定义对象创建实例方法非常标准,但是这不会成为EventEmitter的监听器:如果我将会议的recordStatement实例方法附加到比方说,一个人/发射器发出的语句事件,我失去了对recordStatement监听器范围内的会议实例属性的访问权限,所以对于上面的例子,来自人的语句事件,this.minutes是未定义。
我想我可以在这里使用一个中间对象,它可以保存对会议实例的引用,但是,看起来很像布线。
我该如何设计呢?谢谢!
答案 0 :(得分:1)
将函数调用包装在闭包中:
var self = this;
emitter.on('statement', function(name, statement) {
self.recordStatement(name, statement);
});
或使用.bind()
(可能比使用闭包慢):
emitter.on('statement', this.recordStatement.bind(this));