javascript中未调用构造函数时的绑定

javascript中未调用构造函数时的绑定,javascript,prototype,this,Javascript,Prototype,This,此代码是javascript中构造函数函数体的一部分: window.addEventListener("load", function(){ this._updateFilter(); }.bind(this)); \u updateFilter方法属于该构造函数的原型对象: Constructor.prototype._updateFilter = function(){ // some code }; 我对在创建构造函数的新实例之前调用\u updateFilter感

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

window.addEventListener("load", function(){
    this._updateFilter();
}.bind(this));
\u updateFilter方法属于该构造函数的原型对象:

Constructor.prototype._updateFilter = function(){
    //  some code
};
我对在创建构造函数的新实例之前调用\u updateFilter感到困惑。因此,没有:

var obj = new Constructor();
但是\u updateFilter是在加载时调用的吗?有人能解释一下吗


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

  • 使用特殊的
    new
    关键字,我们告诉JavaScript解释器调用构造函数,并在其中提供一个新对象

  • 解释器将构造函数中的
    设置为该新对象在内存中的引用

  • 接下来,在
    窗口上创建一个事件侦听器。我们向侦听器传递一个回调函数,它是
    this
    对象的闭包,使当前的
    this
    引用可用。但该回调尚未执行,并且在窗口的
    load
    事件触发之前不会执行

  • 假设它确实立即开火(即,实际上不是回调),我们会遇到问题。即使
    这个
    在当时存在,并且实际上已经从
    构造函数.prototype
    继承,它也没有这样的方法
    \u updateFilter
    。然后,解释器将检查原型链,并查看
    Constructor.prototype
    上也没有这样的函数。它将继续沿着链向上,找不到函数,并将抛出一个错误。但请记住,回调尚未启动

  • 回到实际发生的事情:接下来我们用新方法
    \u updateFilter
    扩展
    构造函数的原型

  • 因此,最终窗口的
    load
    事件确实会触发,并真正调用回调。解释器检查
    \u updateFilter
    是否存在于
    上,检查它是否存在,然后检查其原型链。现在,它发现函数确实存在于构造函数.prototype上,并运行该代码


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

  • 使用特殊的
    new
    关键字,我们告诉JavaScript解释器调用构造函数,并在其中提供一个新对象

  • 解释器将构造函数中的
    设置为该新对象在内存中的引用

  • 接下来,在
    窗口上创建一个事件侦听器。我们向侦听器传递一个回调函数,它是
    this
    对象的闭包,使当前的
    this
    引用可用。但该回调尚未执行,并且在窗口的
    load
    事件触发之前不会执行

  • 假设它确实立即开火(即,实际上不是回调),我们会遇到问题。即使
    这个
    在当时存在,并且实际上已经从
    构造函数.prototype
    继承,它也没有这样的方法
    \u updateFilter
    。然后,解释器将检查原型链,并查看
    Constructor.prototype
    上也没有这样的函数。它将继续沿着链向上,找不到函数,并将抛出一个错误。但请记住,回调尚未启动

  • 回到实际发生的事情:接下来我们用新方法
    \u updateFilter
    扩展
    构造函数的原型

  • 因此,最终窗口的
    load
    事件确实会触发,并真正调用回调。解释器检查
    \u updateFilter
    是否存在于
    上,检查它是否存在,然后检查其原型链。现在,它发现函数确实存在于构造函数.prototype上,并运行该代码


  • 您提供的代码在创建实例之前确实不会调用
    \u updateFilter
    。请向我们展示整个代码或提供一个示例来演示这种奇怪的行为。您应该将代码片段简化为
    window.addEventListener(“加载”,this.\u updateFilter.bind(this))
    您是对的,对不起。此方法在创建实例后调用。此代码段是todomvc项目中vanillsjs示例的一部分。您提供的代码在创建实例之前确实不会调用
    \u updateFilter
    。请向我们展示整个代码或提供一个示例来演示这种奇怪的行为。您应该将代码片段简化为
    window.addEventListener(“加载”,this.\u updateFilter.bind(this))
    您是对的,对不起。此方法在创建实例后调用。这段代码是来自todomvc项目的vanillsjs示例的一部分。