js继承的六种继承方式
function Person(){
this.name = 'person'
}
1.原型链继承
function Child1(){
this.name = 'child1'
}
Child1.prototype = new Person()
原型链继承让新实例的原型等于父类的实例
优势:实例可以继承实例的构造函数的属性,父类的构造函数属性,父类原型的属性(实例不会继承父类实例的属性)
劣势:新实例无法向父类构造函数传参、继承单一、所有新实例都会共享父类实例的属性。原型上的属性是共享的,一个实例修改了原型属性,另外一个实例的原型属性也会被修改
2.构造函数继承
//构造函数继承
function Child2(){
Person.call(this)
}
var child2 = new Child2()
用call和apply将父类构造函数引入子类函数
之继承了父类构造函数的属性,没有继承父类原型的属性
解决了原型链的继承缺点
可以继承多个构造函数属性
子实例可以像父实例中传参
劣势:只能继承父类构造函数重点 属性 无法实现构造函数的 复用 构造函数副本过多 臃肿
3.组合继承
function Child3(){
Person.call(this)
}
Child3.prototype = new Person()
结合了以上两种方式的优点 :传参和复用
缺陷:调用了两次父类构造函数子类的构造函数会替代原型上的那个父类构造函数
4.原型式继承
funtion content(obj){
function F(){}
F.prototype = obj
return new F()
}
var child4 = content(new Person())
5.寄生式继承
funtion content(obj){
function F(){}
F.prototype = obj
return new F()
}
function Child5(obj){
var con = content(obj)
con.name = 'aaa'
return con
}
6.寄生组合式继承
function content(obj){
function F(){}
F.prototype = obj
return new F()
}
function Child6(){
Person.call(this)
}
var con= content(Person.prototype)
Child6.prototype = con
con.constructor = Child6
https://www.cnblogs.com/ranyonsue/p/11201730.html