2016-03-07 107 views
3

他對我們這的意思是:功能構造

「當創建一個函數對象,即 生產函數對象的功能構造運行一些像這樣的代碼:

this.prototype = {constructor: this};

新功能對象被賦予一個原型屬性,其值是 含一個構造屬性,其值是新 功能對象」的對象

解釋一個例子會很好。

+0

試着創建一個函數,然後檢查它的'.prototype'屬性。 – Bergi

+1

我不確定什麼是不明確的「*當一個函數對象被創建時,它被賦予一個原型屬性,其值是一個包含一個構造函數屬性,其值是新的函數對象*」的對象。你不瞭解哪一部分? – Bergi

+1

道格讓它聽起來更復雜,而不是過於精確...... – dandavis

回答

6

例如,當你定義了這個構造函數:

function MyConstructor() { 
    // ... 
} 

它會自動接收到prototype屬性。它的值是一個constructor屬性的對象,這點回到構造函數:

MyConstructor.prototype; // some object 
MyConstructor.prototype.constructor; // MyConstructor 

這在Creating Function Objects規定:

  1. 創建一個新的原生ECMAScript的對象,並讓˚F是那個對象。

  • 是創建一個新對象如將被表達new Object()其中Object是 標準內置構造與構造的結果那個名字。
  • 調用具有參數"constructor"的[[DefineOwnProperty]]內部方法,Property Descriptor {[[價值]]:˚F,{ [[可寫]]:,[可枚舉]]: false,[[Configurable]]: true}和false
  • 呼叫的˚F帶參數"prototype"的[[DefineOwnProperty]]內部方法,Property Descriptor {[[價值]]:,{[[可寫]]:,[可枚舉]]: false,[[Configurable]]:false}和false
  • 然後,構造的情況下,將其prototype對象繼承:

    var myInstance = new MyConstructor(); 
    Object.getPrototypeOf(myInstance); // MyConstructor.prototype 
    

    如果你想知道用於創建實例的構造,可以使用constructor屬性,該屬性希望可以繼承:

    myInstance.constructor; // MyConstructor 
    
    +1

    引用規範的+1 - 希望它不會混淆OP更多 – Bergi