2013-05-29 30 views
1

不能調用此代碼是一個構造函數體在JavaScript的一部分:結合的這個時構造在javascript

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

_updateFilter方法屬於原型構造的對象:

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

我很困惑_updateFilter之前調用構造函數的新實例是creat編輯。因此,有沒有:

var obj = new Constructor(); 

_updateFilter被調用的onload?有人可以解釋這個嗎?

感謝

+1

您提供的代碼確實在實例創建之前確實不會調用'_updateFilter'。請向我們展示整個代碼或提供一個演示這種奇怪行爲的示例。 – Bergi

+0

你應該把這個片段縮小到'window.addEventListener(「load」,this._updateFilter.bind(this))' – Bergi

+0

你說得對,對不起。此方法在創建實例後調用。這個片段是來自todomvc項目的vanillsjs示例的一部分.https://github.com/tastejs/todomvc/blob/gh-pages/vanilla-examples/vanillajs/js/controller.js – carousel

回答

1

很簡單,因爲聽者回調,甚至構造本身的定義並不意味着這是在它被定義的時候調用。實際上,構造函數只是一個函數。像任何函數聲明一樣,它定義了調用時會發生什麼。如果我們不調用它,什麼都不會發生。在構造函數的情況下,我們在創建它的一個新實例時調用它。最終,你的應用程序將調用構造函數,這裏就是在那個時候會發生什麼:

  1. 使用特殊new關鍵字,我們告訴JavaScript解釋器調用構造函數併爲其提供內部的新對象它。

  2. 解釋器在構造函數中設置this作爲該新對象在內存中的引用。

  3. 接下來,在window上創建事件偵聽器。我們將回調函數傳遞給該偵聽器,該偵聽器通過this對象關閉,從而使我們當前的this引用可用。但該回調尚未執行,直到窗口的load事件觸發。

  4. 想象一下,它立即發生了火災(即實際上不是回調),我們會遇到問題。儘管this當時存在,實際上已經從Constructor.prototype繼承,但它沒有這樣的方法_updateFilter。然後解釋者檢查原型鏈,並看到Constructor.prototype上也沒有這樣的功能。它會繼續上鍊,找不到函數,並且會拋出錯誤。但請記住,回調不會觸發。

  5. 回到實際發生的事情:接下來我們用新方法_updateFilter擴展Constructor的原型。

  6. 因此,最終窗口的load事件確實觸發並且真正調用了回調。口譯人員檢查上是否存在_updateFilter,發現它沒有,然後檢查其原型鏈。現在它發現該函數確實存在於Constructor.prototype,並運行該代碼。