我对这种编码模式感到有点困惑,即使我一直在研究'这个'。以下(简化)代码显示了模式:
var MyConstructor = function MyConstructor() {
this._handlers = {
action: this.handleAction.bind(this)
};
};
MyConstructor.prototype.start = function(someObj) {
this.someObj.on(’some event’, this._handlers.action); //<--here
}
MyConstructor.prototype.handleAction = function() {
//do stuff
}
module.exports = MyConstructor;
我的问题是,为什么构造函数中的私有方法是必需的?这种模式是否避免了一些常见问题?评论//<--here
的行可以简单地为:
this.someObj.on(’some event’, this.handleAction);
答案 0 :(得分:3)
this
的值。
this.handleAction
将函数传递给on
,没有任何上下文。没有指定this
的值。该值将在执行该功能时确定。该值很可能不是MyConstructor
对象,因此this.start
例如,不会引用正确的对象,或者实际上可能是任何对象所有
解决方案是bind
上下文。这将永远设置上下文,因此this
将始终引用正确的值。你看到这行代码:
action: this.handleAction.bind(this)
这意味着,当代码稍后引用this._handlers.action
时,它将使用适当的上下文将函数发送到on
,因此this
将始终指向正确的值。
答案 1 :(得分:2)
以下几行之间的区别
this.someObj.on(’some event’, this.handleAction.bind(this));
this.someObj.on(’some event’, this.handleAction);
...是第一个handleAction将运行,它是MyConstructor的实例,而第二个将在事件处理机制决定的任何上下文中运行。如果它是这样的话,它将作为全局对象运行:
function on (a, callback) {
callback(); // callback is run with this as the global object
// UNLESS it was bound to something else
}
'private'_handlers属性只是一个对象,它保存对绑定到实例的回调的引用。如果要调用bind两次,则会创建两个函数。 _handlers属性使得创建一个绑定函数,可以将其用作任意数量事件的处理程序。