为什么这个私有方法在构造函数中?

时间:2013-11-13 09:22:21

标签: javascript node.js

我对这种编码模式感到有点困惑,即使我一直在研究'这个'。以下(简化)代码显示了模式:

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

2 个答案:

答案 0 :(得分:3)

不,他们是不同的。不同之处在于 context ,这意味着函数中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属性使得创建一个绑定函数,可以将其用作任意数量事件的处理程序。