原型的继承

//原型链继承,问题会更改引用值的改变
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) 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值