好家伙,好家伙,本篇為《JS高級程式設計》第八章“物件、類與面向物件編程”學習筆記
1.原型鏈
原型鏈是JS實作"繼承"的方案之一
ECMA-262把原型鏈定義為ECMAScript的主要繼承方式,其基本思想就是通過原型繼承多個參考型別的屬性和方法,
重溫一下建構式、原型和實體的關系:每個建構式都有一個原型物件,原型有一個屬性指回建構式,而實體有一個內部指標指向原型,
如果原型是另一個型別的實體呢?那就意味著這個原型本身有一個內部指標指向另一個原型,相應地另一個原型也有一個指標指向另一個建構式,
這樣就在實體和原型之間構造了一條原型鏈,這就是原型鏈的基本構想,
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;
};
let instance = new SubType();
console.log(instance.getSuperValue()); // true

這個例子中實作繼承的關鍵,是SubType沒有使用默認原型,而是將其替換成了一個新的物件,
這個新的物件恰好是SuperType的實體,
這樣一來,SubType的實體不僅能從SuperType的實體中繼承屬性和方法,而且還與SuperType的原型掛上了鉤,
于是我們可以來看看他們的關系網

實際上,原型鏈中還有一環,默認情況下,所有參考型別都繼承自Object,這也是通過原型鏈實作的,完整的繼承鏈

這樣做有什么好處?
1.實作了繼承
2.實體可以使用這個"鏈"上的所有內容,
特點:
1.就近原則,在讀取實體上的屬性時,首先會在實體上搜索這個屬性,
如果沒找到,則會繼承搜索實體的原型,在通過原型鏈實作繼承之后,搜索就可以繼承向上,搜索原型的原型,
對屬性和方法的搜索會一直持續到原型鏈的末端,
2.instanceof()方法和isPrototypeOf()方法
原型與實體的關系可以通過instanceof()方法和isPrototypeOf()方法來確定,
使用instanceof()方法檢測實體的原型鏈中出現過相應的建構式
使用isPrototypeOf()方法判斷當前物件是否為另外一個物件的原型
function SuperType() {
this.property = true;
}
function SubType() {
this.subproperty = false;
}
// 繼承SuperType
SubType.prototype = new SuperType();
let instance = new SubType();
console.log(instance instanceof Object);
console.log(instance instanceof SuperType);
console.log(instance instanceof SubType);
console.log(Object.prototype.isPrototypeOf(instance));
console.log(SuperType.prototype.isPrototypeOf(instance));
console.log(SubType.prototype.isPrototypeOf(instance));

(全對?)
3.方法覆寫
子類有時需要增加父類沒有的方法 (不然為什么會需要子類...)
也可以進行方法覆寫
function SuperType() {
this.property = true;
}
SuperType.prototype.getSuperValue = function () {
return this.property;
};
function SubType() {
this.subproperty = false;
}
// 繼承SuperType
SubType.prototype = new SuperType();
//新方法
SubType.prototype.getSuperValue = https://www.cnblogs.com/FatTiger4399/p/function () {
return this.subproperty;
};
//覆寫已有的方法
SubType.prototype.getSuperValue = https://www.cnblogs.com/FatTiger4399/p/function () {
console.log("getSubValue()方法已被覆寫")
};
let instance = new SubType();
console.log(instance.getSuperValue()); // false

4.其它的繼承方法
JavaScript繼承(圖解筆記) - 簡書 (jianshu.com)
(寫的挺好的,一篇直接看懂JS剩下的幾種實作繼承的方式)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/540904.html
標籤:JavaScript
上一篇:JS如何回傳異步呼叫的結果?
下一篇:JS如何回傳異步呼叫的結果?
