function SuperClass() {
this.x = 'I am super'
}
SuperClass.prototype.say = function() {
console.log(this.x)
}
一:原型鏈繼承,一般不用
缺點(diǎn)1:包含引用類型值時(shí)會(huì)改變
缺點(diǎn)2:無(wú)法在不影響所有原型對(duì)象時(shí)培遵,向超類型的構(gòu)造函數(shù)傳遞參數(shù)
function SubClass1() {
this.y = 4
}
SubClass1.prototype = new SuperClass()
new SubClass1().say() // I am super
二:借用構(gòu)造函數(shù)登刺,一般不用
function SubClass2() {
SuperClass.call(this)
}
new SubClass2().say() // not a function,說(shuō)明無(wú)法復(fù)用原型鏈上的方法
SubClass2.prototype.subSay = function() {
console.log(this.x)
}
new SubClass2().subSay() // I am super
三:組合繼承纸俭,唯一缺點(diǎn):調(diào)用了兩次超類型構(gòu)造函數(shù)
function SubClass3() {
SuperClass.call(this)
this.y = '4'
}
SubClass3.prototype = new SuperClass()
new SubClass1().say() // I am super
四:原型式繼承,缺點(diǎn)是和原型鏈一樣的
function create(obj) {
function F() {}
F.prototype = obj
return new F();
}
const subClass4 = create(new SuperClass())
五:寄生式繼承掉蔬,即以工廠模式再次封裝以增強(qiáng)對(duì)象
function parasitic(obj) {
var clone = create(obj)
// 增強(qiáng)對(duì)象
clone.sayHi = function() {
console.log(this.x + 'Hi')
}
return clone
}
六:寄生組合式繼承,普遍認(rèn)為最好
function inheritPrototype(SubClass6, SuperClass) {
var prototype = create(obj)
prototype.constructor = SuperClass
SubClass6.prototype = prototype
}
七:Es6繼承
class SuperClass {
constructor() {
this.x = 'I am super'
}
say() {
console.log(this.x)
}
}
class SubClass7 extends SuperClass {
constructor() {
super() // 必須調(diào)用超類構(gòu)造函數(shù)箭启,否則報(bào)錯(cuò)
this.x = 'I am Sub'
}
}