2012-10-17 101 views
2

我試圖理解Mozilla在構造函數鏈上的一些代碼。我已經爲我認爲理解的部分添加了評論,但我仍然不清楚所發生的一切。有人可以一行一行地解釋這段代碼是怎麼回事?JavaScript函數構造函數鏈接使用apply()函數

// Using apply() to chain constructors. 
Function.prototype.construct = function (aArgs) { 

    // What is this line of code doing? 
    var fConstructor = this, fNewConstr = function() { fConstructor.apply(this, aArgs); }; 

    // Assign the function prototype to the new function constructor's prototype. 
    fNewConstr.prototype = fConstructor.prototype; 

    // Return the new function constructor. 
    return new fNewConstr(); 
}; 

// Example usage. 
function MyConstructor() { 

    // Iterate through the arguments passed into the constructor and add them as properties. 
    for (var nProp = 0; nProp < arguments.length; nProp++) { 
     this["property" + nProp] = arguments[nProp]; 
    } 
} 

var myArray = [4, "Hello world!", false]; 
var myInstance = MyConstructor.construct(myArray); 

// alerts "Hello world!" 
alert(myInstance.property1); 

// alerts "true" 
alert(myInstance instanceof MyConstructor); 

// alerts "MyConstructor" 
alert(myInstance.constructor); 

The original code can be found here.

回答

2

基本上,這是調用構造函數,它給你的機會來包裝另一個函數的構造函數調用的另一種方法。我會專注於你感到困惑的一行。 fConstructor設置爲this,它引用了我們原來的構造函數,在本例中爲MyConstructorfNewConstr是將覆蓋原始構造函數的構造函數。在fNewConstr之內,您可以實現MyConstructor中找不到的其他代碼。在fNewConstr內,我們使用函數apply方法調用fConstructor,傳遞this作爲上下文,並將aArgs數組傳遞給構造方法。然後我們將fNewConstr的原型設置爲fConstructor原型來完成繼承鏈。最後,我們返回fNewConstr的新實例。將new關鍵字添加到函數調用中會創建一個新對象,將其原型設置爲該函數的原型,並在新項目的上下文中調用該函數。由於我們將fConstructor方法應用於fNewConstr的上下文,因此結果與調用new MyConstructor()基本相同。合理?或者我需要進一步細化。

+0

感謝您的詳細解答。這就說得通了。你會用什麼樣的場景來進行這種類型的構造器操作? – Halcyon

+0

你會爲任何類型的OO繼承情況使用類似的東西。假設你有一個創建Animal對象的構造函數,並且你想擴展Animal構造函數來創建一個Dog構造函數。您可能想要在Dog構造函數中執行特定於Dog對象的一些任務,但您仍然想將原始Animal構造函數應用於該對象。這種模式可以讓你做到這一點。 –

+0

這看起來非常類似於c#實例構造函數。 – Halcyon