ES6 class的繼承

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的靜態方法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章