//原型链继承,问题会更改引用值的改变
function Super(){
this.a=[1,2,3,4]
}
Super.prototype.say=function(){
console.log(2222)
}
function Sub(){
}
Sub.prototype=new Super();
var sub1= new Sub();
var sub2=new Sub();
sub1.a.push(5)
特点:
非常纯粹的继承关系,实例是子类的实例,也是父类的实例
父类新增原型方法/原型属性,子类都能访问的到
缺点:
要想为子类新增属性和方法,必须要在new Animal()这样的语句之后执行,不能放到构造器中
无法实现继承多个
来自原型对象的所有属性被所有实例共享
创建子类实例时,无法向父类构造函数传参
//第二种方法,构造函数继承,没办法拿到原型上的方法
function Super(){
this.a=[1,2,3,4]
}
Super.prototype.say=function(){
console.log(2222)
}
function Sub(num){
Super.call(this,num)
}
var sub1= new Sub([1,2,3,4]);
var sub2=new Sub();
console.log(sub1)
特点:
创建子类实例时,可以向父类传递参数
可以实现多继承(call多个父类对象)
缺点:
实例并不是父类的实例,只是子类的实例
只能继承父类的实例属性和方法,不能继承原型属性/方法
无法实现函数复用,每个子类都有父类实例函数的副本,影响性能
//组合继承,使用原型链继承一次再用构造函数继承一次
function Super(){
this.a=[1,2,3,4]
}
Super.prototype.say=function(){
console.log(2222)
}
function Sub(){
Super.call(this)
}
Sub.prototype=new Super()
var sub1= new Sub();
var sub2=new Sub();
console.log(sub1.b)
特点:
弥补了方式2的缺陷,可以继承实例属性/方法,也可以继承原型属性/方法
既是子类的实例,也是父类的实例
不存在引用属性共享问题
函数可复用
可传参
缺点:
调用了俩次构造函数,生成了俩份实例(子类实例将子类原型上的那份屏蔽了)
//寄生组合继承
function Super(){
this.a=[1,2,3,4]
}
Super.prototype.say=function(){
console.log(2222)
}
function Sub(){
Super.call(this)
}
if(!Object.create){//解决兼容
Object.create=function(proto){
function F(){
F.prototype=proto
return new F();
}
}
}
Sub.prototype=Object.create(Super.prototype)
var sub1= new Sub();
var sub2=new Sub();
console.log(sub1.b)