class Animal {
constructor(){
this.type = 'animal'
}
says(say){
console.log(this.type + ' says ' + say)
}
}
let animal = new Animal()
animal.says('hello') //animal says hello
class Cat extends Animal {
constructor(){
super()
this.type = 'cat'
}
}
let cat = new Cat()
cat.says('hello') //cat says hello
上面代碼首先用class定義了一個“類”昆烁,可以看到里面有一個constructor方法吊骤,這就是構(gòu)造方法,而this關(guān)鍵字則代表實例對象静尼。簡單地說白粉,constructor內(nèi)定義的方法和屬性是實例對象自己的传泊,而constructor外定義的方法和屬性則是所有實例對象可以共享的。
Class之間可以通過extends關(guān)鍵字實現(xiàn)繼承鸭巴,這比ES5的通過修改原型鏈實現(xiàn)繼承眷细,要清晰和方便很多。上面定義了一個Cat類鹃祖,該類通過extends關(guān)鍵字溪椎,繼承了Animal類的所有屬性和方法。
super關(guān)鍵字恬口,它指代父類的實例(即父類的this對象)校读。子類必須在constructor方法中調(diào)用super方法,否則新建實例時會報錯祖能。這是因為子類沒有自己的this對象歉秫,而是繼承父類的this對象,然后對其進(jìn)行加工养铸。如果不調(diào)用super方法雁芙,子類就得不到this對象。
ES6的繼承機(jī)制钞螟,實質(zhì)是先創(chuàng)造父類的實例對象this(所以必須先調(diào)用super方法)兔甘,然后再用子類的構(gòu)造函數(shù)修改this。