課程思維導圖
Q:類的宣告有哪些方式,如何例項化?
// 建構函式法
function Animal() {this.name = "name"};
------------------------------------------
// ES6類
class Animal {
constructor () {
this.name = "name";
}
}
------------------------------------------
// 類的例項化
new Animal
複製程式碼
Q:繼承的本質是?
原型鏈
Q:如何實現繼承?
一、藉助建構函式實現繼承
/**
* 原理:改變父類建構函式執行時的this指向,從而實現了繼承
* 不足:只實現部分繼承,父類原型物件上的屬性/方法子類取不到。
*/
function Parent1 () {
this.name="parent1"
}
function Child1 () {
Parent.call(this);
this.type = "child1";
}
複製程式碼
二、藉助原型鏈實現繼承
/**
* 原理:原理:new Child2 => new Child2.__proto__ === Child2.prototype => new Parent2() => new Parent2().__proto__ === Parent2.prototype,所以實現了Child2例項繼承自Parent2的原型物件。
* 不足:多個例項共用一個父類的例項物件,修改其中一個例項上的引用物件,會對其他例項造成影響。
*/
function Parent2 () {
this.name = "parent2";
}
function Child2 () {
this.name = "child2";
}
Child2.prototype = new Parent2();
複製程式碼
三、組合方式實現繼承
/**
* 優點:彌補了原型鏈繼承的缺點,例項修改父類上的引用物件時,不會對其他實際造成影響
* 不足:父級建構函式執行兩次,子類建構函式指向父類建構函式
*/
function Parent3 () {
this.name = "parent3";
}
function Child3 () {
Parent3.call(this);
}
Child3.prototype = new Parent3();
複製程式碼
四、組合方式優化
/**
* 組合方式優化
* 不足:子類建構函式仍舊指向父類建構函式
*/
function Parent4 () {
this.name = "parent4";
}
function Child4 () {
Parent4.call(this);
}
Child4.prototype = Parent4.prototype;
複製程式碼
五、組合繼承方式的完美方案
/**
* 優點:Object.create()生成中間物件,隔離了子/父類原型物件,使之不會互相影響。
*/
function Parent5 () {
this.name = "parent5";
}
function Child5 () {
Parent5.call(this);
}
Child5.prototype = Object.create(Parent5.prototype);
Child5.prototype.constructor = Child5;
複製程式碼