ECMAScript 中描述了原型鏈的概念,并將原型鏈作為實現(xiàn)集成的主要方法。其基本思想是利用原型讓一個引用類型繼承另一個引用類型的屬性和方法鸦做。
構(gòu)造函數(shù)叠萍、原型和實例的關(guān)系:
每個構(gòu)造函數(shù)都有一個原型對象,原型對象都包含一個指向構(gòu)造函數(shù)的指針渡讼,而實例都包含一個指向原型對象的內(nèi)部指針蹋盆。
那么,假如我們讓原型對象等于另一個類型的實例栖雾,此時的原型對象將包含一個指向另一個原型(原型2)的指針伟众,顯然原型2中也包含一個指向構(gòu)造函數(shù)2的指針,同樣的账胧,原型2又是原型3的實例,層層遞進筹煮,就構(gòu)成了實例與原型鏈的鏈條居夹。即原型鏈。
代碼演示如下:
function SuperType() {
this.property = true;
}
SuperType.prototype.getSuperValue = function () {
return this.property;
};
function SubType() {
this.subproperty = false;
}
//繼承了SuperType
SubType.prototype = new SuperType();
SubType.prototype.getSubValue = function () {
return this.subproperty;
};
var instance = new SubType();
alert(instance.getSuperValue()); //true
以上代碼定義了SuperType和SubType這兩個類型劫扒,其分別有一個屬性和方法狸膏。通過創(chuàng)建SuperType的實例湾戳,并將該實例賦給SubType.prototype,實現(xiàn)了Subtype對SuperType的繼承遮晚。因此拦止,SuperType的所有屬性和方法,現(xiàn)在也存在于SubType.prototype中萧求。之后,我們又給SubType.prototype添加了方法getSubValue顶瞒,這樣就在繼承了SuperType的屬性和方法的基礎(chǔ)上又添加了一個新方法。
結(jié)合上邊的例子守问,根據(jù)原型搜索機制坑资,調(diào)用instance.getSuperValue()會經(jīng)歷sanger搜索步驟:搜索實例→搜索SubType.prototype→搜索SuperType.prototype,最后找到該方法袱贮。
所有函數(shù)的默認原型都是object的實例,因此默認原型都會包含一個指向object.prototype的內(nèi)部指針嗽仪。因此,所有自定義類型才會繼承toString()沽翔、valueOf()等默認方法窿凤。
確定原型和實例的關(guān)系:
- instanceof 操作符:
alert(instance instanceof Object); //true
alert(instance instanceof SuperType); //true
alert(instance instanceof SubType); //true
- isPrototypeOf()方法
alert(Object.prototype.isPrototypeOf(instance)); //true
alert(SuperType.prototype.isPrototypeOf(instance)); //true
alert(SubType.prototype.isPrototypeOf(instance)); //true
注意
- 給原型添加方法的代碼一定要放在替換原型的語句之后
- 不能使用對象字面量創(chuàng)建原型方法
- 包含引用類型值的原型屬性會被所有實例共享