1

这段代码是 javascript 中构造函数体的一部分:

window.addEventListener("load", function(){
    this._updateFilter();
}.bind(this));

_updateFilter方法属于该构造函数的原型对象:

Constructor.prototype._updateFilter = function(){
    //  some code
};

我对在创建Constructor 的新实例之前调用_updateFilter的事情感到困惑。所以没有:

var obj = new Constructor();

但是_updateFilter是在onload时调用的吗?有人可以解释一下吗?

谢谢

4

1 回答 1

1

仅仅因为定义了侦听器回调甚至构造函数本身并不意味着它在定义时被调用。实际上,构造函数只是一个函数。像任何函数声明一样,它定义了调用时会发生什么。如果我们不调用它,什么都不会发生。在构造函数的情况下,当我们创建它的新实例时调用它。最终,您的应用程序将调用构造函数,此时会发生以下情况:

  1. 使用 specialnew关键字,我们告诉 JavaScript 解释器调用构造函数并在其中提供一个新对象。

  2. 解释器this在构造函数内部设置为内存中对该新对象的引用。

  3. 接下来,在window. 我们将一个回调函数传递给那个监听器,它是this对象的闭包,使我们当前的this引用可用。但是该回调尚未执行,并且在窗口load事件触发之前不会执行。

  4. 想象一下它确实立即触发了(即实际上不是回调),我们会遇到问题。虽然this当时存在,实际上已经继承自Constructor.prototype,但它没有这样的方法_updateFilter。然后解释器将检查原型链,并查看其中任何一个都没有这样的函数Constructor.prototype。它会继续上链,找不到函数,并且会抛出错误。但请记住,回调尚未触发。

  5. 回到实际发生的事情:接下来我们Constructor用新方法扩展 的原型_updateFilter

  6. 所以最终窗口的load事件确实触发并且回调真的被调用了。解释器检查 上是否_updateFilter存在this,发现不存在,然后检查其原型链。现在它发现该函数确实存在于 上Constructor.prototype,并运行该代码。

于 2013-05-29T21:39:14.883 回答