每個(gè)對(duì)象都與對(duì)象原型關(guān)聯(lián),繼承了對(duì)象原型的屬性。
所有對(duì)象創(chuàng)建時(shí)都從字面量對(duì)象({})繼承,且都自動(dòng)鏈接到的Object.prototype,Object.prototype 來(lái)自JavaScript標(biāo)準(zhǔn)。
當(dāng)JavaScript解釋器(在瀏覽器中一個(gè)模塊),試圖找到一個(gè)屬性,它要檢索,如下面的代碼:
var adult = {age: 26},
retrievedProperty = adult.age;
// 看上一行
首先,解釋器檢查對(duì)象有的每個(gè)屬性。例如,adult只有一個(gè)自己的屬性 - age。但是,除此之外,實(shí)際上還有幾個(gè)屬性,這是繼承自O(shè)bject.prototype。
var stringRepresentation = adult.toString();
// 變量的值為 '[object Object]'
toString 是一個(gè) Object.prototype 的屬性, 這是繼承。它有一個(gè)函數(shù),返回值為一個(gè)對(duì)象的字符串。如果希望它返回一個(gè)更有意義的東西,那么你可以將其覆蓋。簡(jiǎn)單的添加一個(gè)屬性到adult對(duì)象。
adult.toString = function(){
return "I'm "+this.age;
}
如果現(xiàn)在調(diào)用 toString 函數(shù),解釋器將發(fā)現(xiàn)一個(gè)新的對(duì)象中的屬性然后停止。
解釋器解析某個(gè)屬性時(shí)會(huì)先檢查對(duì)象自己,再進(jìn)一步檢查他的原型。
要設(shè)置自己的對(duì)象為原型而不是默認(rèn)的Object.prototype,你可以調(diào)用以下的Object.create:
var child = Object.create(adult);
/* 通過(guò)這種方式創(chuàng)建的對(duì)象可以讓我們輕松替換默認(rèn)的Object.prototype成我們想要的。在這里,child的原型是adult對(duì)象。
*/
child.age = 8;
/* 在此之前,child根本沒(méi)有自己的年齡屬性,解釋器會(huì)尋找child的原型中是否有該屬性?,F(xiàn)在,當(dāng)我們?cè)O(shè)置了child自身年齡,解釋器就不深入尋找了。
注意:adult的年齡仍為26。
*/
var stringRepresentation = child.toString();
// 值為 "I'm 8"。
/* 注意:我們沒(méi)覆蓋child的toString屬性,因此adult類函數(shù)不會(huì)被調(diào)用。如果adult沒(méi)有toString屬性,那么Object.prototype的toString類函數(shù)將被調(diào)用,我們將得到"[object Object]" 而不是 "I'm 8" 。
*/
child'的原型是adult,其原型為Object.prototype。這一系列原型被稱為原型鏈。