ES5中的繼承通過修改原型鏈實現繼承,而在ES6中class 可以通過extends關鍵字實現繼承 ,要清晰和方便很多。
class Animal{
constructor(x, y) {
this.x = x;
this.y = y;
}
}
class Dog extends Animal{
constructor(x, y, type) {
super(x, y); // 調用父類的constructor(x, y)
this.type = type;
}
}
上面代碼定義了一個Dog 類,該類通過extends關鍵字,繼承了Animal類的所有屬性和方法。
上面代碼中的super關鍵字,它在這裏表示父類的構造函數,用來新建父類的this對象。
子類必須在constructor方法中調用super方法,否則新建實例時會報錯。
class Animal{
}
class Dog extends Animal{
constructor() {
}
}
let labrador = new Animal();//報錯
extends關鍵字和super關鍵字是綁定出現的,兩者必須同時使用,不然就會報錯。
ES6 的繼承機制完全不同,實質是先將父類實例對象的屬性和方法,加到this上面(所以必須先調用super方法),然後再用子類的構造函數修改this。
class Animal{
constructor(x, y) {
this.x = x;
this.y = y;
}
}
class Dog extends Animal{
constructor(x, y, type) {
this.type = type;//報錯
super(x, y);
}
}
上面代碼中,子類的constructor方法沒有調用super之前,就使用this關鍵字,結果報錯,所以調用super必須在this關鍵字之前。
父類的靜態方法,也會被子類繼承。
class Animal{
static jiao(){
console.log('jiao');
}
}
class Dog extends Animal{
}
Dog.jiao();//jiao
上面代碼中,jiao()是Animal類的靜態方法,Dog繼承Animal,也繼承了Animal的靜態方法。