在es6推出之前js是没有class语法糖的这里使用js.prototype属性来模式继承特性
大体上有以下几种继承方式
首先准备一个父类
function father(name){
this.name = name
}
father.prototype.myName=function(){
console.log( `我是${this.name}`)
}
1:原型继承(子类构造直接指向父类实例)
function son(){
}
son.prototype = new father() //将子类添加到父类原型链上
son.prototype.name = '小明'
let sonSl = new son()
sonSl.myName() //我是小明
缺点:
1.无法灵活传参
2.所有子类实例共享父类属性一改则所有子类均改
2:借调构造继承(子类构造借调父类构造)
function son(name){
father.call(this,name) //借调传参
}
let sonSl = new son('小明')
console.log(sonSl.name)
sonSl.myName() //报错sonSl.myName is not a function
解决了原型继承无法传参及属性共享问题
缺点:
1:不在父类原型链上,无法继承到父类原型
3:组合继承(组合上文两种继承)
function son(name){
father.call(this,name) //借调传参
}
son.prototype = new father() //将子类添加到父类原型链上
let sonSl = new son('小明')
sonSl.myName() //我是小明
解决了借调构造不在父类原型链上的问题
缺点:调用了两次父类构造
4:寄生组合继承
function son(name){
father.call(this,name) //借调传参
}
(function(){
let F = function(){}
F.prototype = father.prototype
son.prototype = new F()
})()
let sonSl = new son('小明')
sonSl.myName() //我是小明
解决了组合继承调用了两次父类构造的问题