繼承是類和類之間的關(guān)系,繼承使得子類別具有父類別的屬性和方法蹋砚。
js里常用的如下兩種繼承方式:
原型鏈繼承(對(duì)象間的繼承)
類式繼承(構(gòu)造函數(shù)間的繼承)
由于js
不像java
那樣是真正面向?qū)ο蟮恼Z(yǔ)言扼菠,js
是基于對(duì)象的摄杂,它沒(méi)有類的概念。所以循榆,要想實(shí)現(xiàn)繼承析恢,可以用js
的原型prototype機(jī)制或者用apply
和call
方法去實(shí)現(xiàn)。
JS繼承的實(shí)現(xiàn)方式
1.原型鏈繼承
function Human(name){
this.name = name
}
Human.prototype.run = function(){
console.log("我叫"+this.name+"秧饮,我在跑")
return undefined
}
function Man(name){
Human.call(this, name)
this.gender = '男'
}
var f = function(){}
f.prototype = Human.prototype
Man.prototype = new f()
Man.prototype.fight = function(){
console.log('糊你熊臉')
}
- 基于class的繼承映挂, 用 funcion 實(shí)現(xiàn)
class Human{
constructor(name){
this.name = name
}
run(){
console.log("我叫"+this.name+",我在跑")
return undefined
}
}
class Man extends Human{
constructor(name){
super(name)
this.gender = '男'
}
fight(){
console.log('糊你熊臉')
}
}
上面兩種方法的優(yōu)缺點(diǎn):
原型鏈繼承
優(yōu)點(diǎn):
- 非常簡(jiǎn)便的實(shí)現(xiàn)了多重繼承的關(guān)系浦楣;
- 能夠確定原型和實(shí)例之間的關(guān)系袖肥;
缺點(diǎn): - 創(chuàng)建子類型實(shí)例時(shí)咪辱,無(wú)法向父類型傳遞參數(shù)振劳,尤其是多重繼承時(shí),弊端非常明顯油狂;
- 所有的實(shí)例會(huì)共享通過(guò)原型鏈繼承的屬性历恐,在一個(gè)實(shí)例中改變了,會(huì)在另一個(gè)實(shí)例中反映出來(lái)专筷;
- 不能使用字面量添加新方法弱贼,會(huì)使繼承關(guān)系中斷(會(huì)重寫constructor屬性);
借用構(gòu)造函數(shù)實(shí)現(xiàn)繼承
優(yōu)點(diǎn):
- 可以通過(guò)使用call可以在調(diào)用的時(shí)候向父類型傳遞參數(shù)磷蛹。
缺點(diǎn): - 僅僅借用構(gòu)造函數(shù)吮旅,方法都在構(gòu)造函數(shù)中定義,就無(wú)法實(shí)現(xiàn)函數(shù)復(fù)用味咳;
- 通過(guò)借用構(gòu)造函數(shù)庇勃,在父類型原型中定義的方法也無(wú)法通過(guò)原型鏈暴露給子類型;