继承(6种方式)以及优缺点

文章介绍了JavaScript中的多种继承实现方式,包括原型链继承、构造函数继承、组合继承、原型式继承、寄生继承和组合寄生继承。详细分析了每种方式的优缺点,如构造函数继承无法继承原型链,原型链继承中引用类型属性的共享问题,以及如何通过组合方式和Object.create()进行优化,以实现更理想的继承效果。
摘要由CSDN通过智能技术生成

.原型链继承

2.构造函数继承

3.组合继承(原型链继承+构造函数继承)

4.原型式继承

5.寄生继承

6.组合寄生继承

代码示例:

//借助构造函数实现继承:缺点是父构造函数的原型链继承不了,若要全部继承除非将所有属性和方法定义在构造函数中function Parent1 () {  this.name = 'parent1';}function Child1 () {  //这么做的好处是定义在父构造函数中的引用类型的属性,对于子构造函数的每个实例来说是独立的  //并且在子构造函数实例化时,可以给父构造函数传参  Parent.call(this);  this.type = 'child1';}
//借助原型链实现继承:缺点是继承的引用类型属性是共享的,子构造函数的实例更改会影响其他实例上的这个属性,比如 play 属性function Parent2 () {  this.name = 'parent2';  this.play = [1, 2, 3];}function Child2 () {  this.type = 'Child2';}Child2.prototype = new Parent2();
//组合方式:缺点是会执行两次父构造函数function Child3 () {  //执行第一次  Parent2.call(this);  this.type = 'Child3';}Child3.prototype = new Parent2(); //执行第二次
//组合优化1,不需要再将定义在父构造函数中的属性和方法再继承一次,只需要继承原型链上的Child3.prototype = Parent2.prototype;//缺点是无法区分一个实例是子函构造函数实例化的还是父构造函数实例化的let s1 = new Child3();//s1.constructor 指向了 Parent2,而不是 Child3,因为 Child3 原型对象的属性 constructor 继承了 Parent2 原型对象上的//如果你强行执行 Child3.prototype.constructor = Child3 的话,也会将 Parent2.prototype.constructor 改成 Child3
//组合优化2,通过 Object.create() 创建一个中间对象,将两个原型对象区别开来,并且继承父构造函数的原型链Child3.prototype = Object.create(Parent2.prototype);Child3.prototype.constructor = Child3;//即 Child3.prototype.__proto__ === Parent2.prototype 为 true//如此 Child3.prototype 和 Parent2.prototype 被隔离开,是两个对象,不会相互影响//这种方式为理想继承方式
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

终究是雾散

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值