JavaScript 中原型继承与寄生继承

引言

在 ES5 中,继承的方式有原型继承,构造继承,原型组合继承,寄生式继承,寄生组合继承。
其实原型组合继承就是原型继承与构造继承的组合,而寄生组合继承则是寄生式继承和构造继承的组合。不尽会猜想是否寄生式继承是原型继承的某种替代方案?如果是的话,那究竟是为什么要选择寄生继承呢?请往下看:

继承方式

1. 原型组合继承

function Father(){
	this.msg = "Hello"
}
Father.prototype.say = function(){console.log(this.msg)}

function Child(){
	Father.call(this); // 第一次:通过 call 调用父构造函数
	this.childMsg = 'child';
}
Child.prototype = new Father(); // 第二次:new 本质上也调用了父构造函数
Child.prototype.run = function(){console.log(this.msg +' '+ this.childMsg)}


let child = new Child();
child.run();
child.say();

2. 寄生组合继承

function inheritProperty(Child,Father){
	let prototype = Object.create(Father.prototype);
	prototype.constructor = Child;
	Child.prototype = prototype
}

function Father(){
	this.msg = "Hello"
}
Father.prototype.say = function(){console.log(this.msg)}

function Child(){
	Father.call(this); // // 第一次:通过 call 调用父构造函数
	this.childMsg = 'child';
}
inheritProperty(Child,Father);   // 替换 Child.prototype = new Father();
Child.prototype.run = function(){console.log(this.msg +' '+ this.childMsg)}

let child = new Child();
child.run();
child.say();

可以看出寄生组合继承与原型组合继承非常类似,只是有一行被替换了。寄生组合继承与原型组合继承相比,寄生组合继承少调用一次父构造函数。寄生组合继承之所以可以调用一次是因为它引入了一个空函数,将父构造函数的原型对象赋予此空函数,然后再将这个空函数的实例赋予子构造函数的原型对象。其实他也调用的两次函数,只不过第二次调用的是空函数,当然比调用父函数的开销要小了,所以寄生组合继承也被都被普遍认为是最理想的继承实现方式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值