什么是繼承呢犹撒?繼承是指子類繼承父類的屬性和方法横腿,便于代碼的復(fù)用
原型繼承
function Parent() {
}
function Child() {
}
child.prototype = new Parent()
//使子類的原型等于父類的實(shí)例,此時(shí)child.prototype.constructor 為Parent函數(shù)對(duì)象
child.prototype.constructor = child //此時(shí)child.prototype.constructor 為child函數(shù)對(duì)象
原型繼承的特點(diǎn):
與其他后臺(tái)語言不同,其他后臺(tái)語言一般是拷貝繼承,把父類的屬性和方法拷貝一份到子類中供子類使用,而JS是把父類的原型放到子類實(shí)例的原型鏈上,是基于__prototype__原型鏈查找機(jī)制完成
子類可以重寫父類的方法并且會(huì)導(dǎo)致父類的其他實(shí)例也受影響
父類的私有或公有屬性和方法,最后都會(huì)變成子類中公有的屬性和方法
不能傳參,不能實(shí)現(xiàn)多繼承
call繼承
function Parent(name,age) {
}
function Child(name, age) {
? Parent.call(this, name, age) //在子類中調(diào)用父類的方法,并改變父類的this指向
}
可以將父類私有的變成子類私有的,但是不能訪問父類原型上的屬性和方法
可以傳參可以實(shí)現(xiàn)多繼承
不能實(shí)現(xiàn)函數(shù)的復(fù)用,每個(gè)子類實(shí)例都會(huì)重新調(diào)用父類實(shí)例函數(shù)
組合繼承
? function Parent(name,age) {
? }
? function Child(name, age) {
?? Parent.call(this, name, age) //在子類中調(diào)用父類的方法,并改變父類的this指向
? }
? Child.prototype = new parent()
父類私有的屬性和方法變成子類私有的屬性和方法,父類公有的屬性和方法變成子類共同的屬性和方法
函數(shù)可復(fù)用可傳參
調(diào)用了兩次父類構(gòu)造函數(shù)颓屑,生成了兩份實(shí)例
組合繼承優(yōu)化
function Parent(name,age) {
}
function Child(name, age) {
? Parent.call(this, name, age) *//在子類中調(diào)用父類的方法,并改變父類的this指向*
}
//var B = Object,create(A),以A為對(duì)象創(chuàng)建B對(duì)象,B對(duì)象繼承A的所有屬性和方法*
Child.prototype = Object.create(Parent)
Child.prototype.constructor = Child
這個(gè)繼承解決了上面繼承的所有缺點(diǎn),是ES5最完美的繼承方式,比較推薦
ES6繼承
class Parent {
? constructor(name, age) {
?? this.name = name
?? this.age = age
? }
}
class Child extends Parent {
? constructor(name,age) {
?? super(name, age) //通過super調(diào)用父類方法
? }
}
用類來定義構(gòu)造函數(shù),在constructor()里面定義構(gòu)造函數(shù)的私有屬性
通過extends實(shí)現(xiàn)類的繼承,在子類的constructor()的第一行寫下super(),來實(shí)現(xiàn)子類的私有屬性繼承父類的私有屬性