2010-11-01 80 views
6

我知道JavaScript函數對象的prototype屬性被複制到通過使用函數作爲構造函數實例化的對象的內部[[Prototype]]屬性(也稱爲__proto__)。所以,我可以將此屬性設置爲任何對象,我想作爲原型:JavaScript函數的原型屬性的初始值是什麼?

function Foo() {} 
Foo.prototype = { 
    toString: function() { return "I'm a Foo!"; } 
} 
new Foo().toString() 
// --> "I'm a Foo!" 

看來,這是普遍的做法是添加應該作爲類方法的現有原型的新行動功能生成的函數是這樣的:

function Bar() {} 
Bar.prototype.toString = function() { 
    return "I'm a Bar!"; 
} 
new Bar().toString() 
// --> "I'm a Bar!" 

這我不清楚,不過,什麼prototype屬性的初始值是。

function Baz() {} 
Baz.prototype 
// --> Baz { 
//  constructor: function Baz() {}, 
//  __proto__: Object 
//  } 

該註釋顯示Chrome的JavaScript控制檯打印的內容。這是否意味着我創建的每個功能實際上創建了兩個對象?一個用於功能本身(constructor),另一個用於其原型?

這是在ECMAScript標準的某個地方定義的嗎?我試圖找到它,但不能。所有瀏覽器都以相同的方式處理這個問題嗎?

回答

10

prototype任何新創建Function實例中的初始值是Object一個新實例,但隨着自有物業constructor設置爲指向回新功能。

這在典型的ECMAScript規格完全不可讀方式通過ECMA262-5中13.2節所描述:

(16)設是創建一個新對象的結果作爲將被構造由表達式new Object()其中Object是標準內置構造具有該名稱

(17)呼叫與參數「構造」的[[DefineOwnProperty]]內部方法,屬性描述符 {[[Value]]:F,{[[Writable]]:true,[[Enumerable]]:false,[[Configurable]]:true}和false。參數「prototype」,屬性描述符{[[Value]]:proto,{[[Writable]]:true,[[Enumerable]]調用F的[[DefineOwnProperty]]內部方法:false,[[Configurable]]:false}和false。

+0

謝謝。那正是我正在尋找的答案。 – MForster 2010-11-01 23:13:11

+1

OMG!我時不時地進入ECMAScript規範,但這很難讀。你是否知道一個能夠逐步解釋所有內容的資源(或者至少解釋那些可怕的部分)? – 2010-11-01 23:32:33

+2

可悲的是。令人遺憾的是,ECMAScript作爲一種真正的英語語言沒有很好的參考,尤其是它的許多功能都是......慷慨......有點古怪。我們已經獲得了像MDC,MSDN和Adobe這樣的供應商特定指南,我們已經得到了ECMA規範的近乎無法使用的規範(您確實習慣了上述語言,但在最好的時候仍然非常沉重),除此之外,還有隨機教程網站的排水溝充滿了錯誤和糟糕的建議。這是世界上使用最廣泛的語言之一。這是無望的。 – bobince 2010-11-02 00:23:12