JavaScript中的繼承是透過原型鏈(prototype chain)來完成的:每個物件內部都有另一個物件作為其prototype而存在,物件從這個prototype中繼承屬性(property)。對於每個物件來說,可以用以下三種方式來存取其原型物件:
1.__proto__。可以透過物件的__proto__屬性來存取其原型物件。此屬性僅在Firefox、Safari和Chrome中得到支持,在IE和Opera中不支持。
2.Object.getPrototypeOf()。物件可以作為參數傳入Object.getPrototypeOf()方法,執行後即傳回物件的原型物件。此方法僅在ECMAScript 5標準中支援。
3.o.constructor.prototype。透過先取得物件的constructor函數,然後再透過存取constructor函數的prototype屬性來存取到原型物件。使用此方法的前提為:物件中存在指向建構函式的constructor屬性。
判斷兩個物件間是否存在原型鏈關係可以使用isPrototype()方法:
對於所有以字面量建立的對象而言,其prototype對象均為Object.prototype(作為一個特殊對象,Object.prototype沒有原型對象):
而對於所有用new操作符建立的物件而言,其prototype物件均為constructor函數的prototype屬性:
JavaScript中使用new運算子建立物件的過程如下:
1.建立一個新的空物件。
2.將這個物件的__proto__屬性指向constructor函數的prototype屬性。
3.將這個物件作為this參數,執行constructor函數。
從上述創建過程可以得出結論:所有從同一個constructor函數中構造出來的對象,其__proto__屬性(也即其原型對象)相等,也就是說,只存在一個原型對象: