1,原型链继承
让构造函数的原型(prototype)是另一个类型的实例,那么该构造函数new出来的实例就具有该实例的属性;缺点,每一个对象实例共享所有的继承和方法,无法向父类传参
function father(){}
function son(){}
son.prototype=new father()
2,构造函数继承
在子类构造函数的内部调用父类构造函数
解决了给父类传参的问题
缺点:访问不了父类原型上的方法和属性,无法实现函数的复用
function father(){}
function son(...a){
father.call(this,...a)
}
3,组合式继承
既可以向父类传参,也可以访问父类原型上的方法
缺点是第一次会调用两次父类的构造函数,一次是在创建子类原型的时候,第二次是在子类构造函数的内部
function father(){}
function son(...a){
father.call(this,...a)
}
son.prototype=new father()
4,extend继承
5,寄生组合继承
只调用了一次父类的函数,避免在son的prototype上面创建不必要的、多余属性
function father(){}
function p(subType){
this.constructor = subType
}
p.prototype=father.prototype
function son(...a){
father.call(this,...a)
}
son.prototype=new p(father)