ES5实现继承及优缺点

本文详细介绍了ES5中的五种继承实现方式:原型链继承、构造函数继承、组合继承、寄生式继承和寄生式组合继承,分析了它们的工作原理、优缺点。特别是寄生式组合继承,它通过减少对父类构造函数的调用来解决组合继承的问题,但依然存在对原型的冗余引用。
摘要由CSDN通过智能技术生成

一、ES5实现继承

原型链的核心只需要记住三点:

  • 每个实例对象都有__proto__属性,该属性指向其构造函数的原型对象,在调用实例的方法和属性时,如果在实例对象上找不到,就会往原型对象上找。
  • 构造函数的prototype属性也指向实例的原型对象
  • 原型对象的constructor属性指向构造函数。

①原型链继承:

原型链继承的原理很简单,直接让子类的原型对象指向父类实例,当子类实例找不到对应的属性和方法时,就会往它的原型对象,也就是父类实例上找,从而实现对父类的属性和方法的继承。

// 父类
function Parent() {
   
    this.name = '29'
}
// 父类的原型方法
Parent.prototype.getName = function() {
   
    return this.name
}
// 子类
function Child() {
   }

// 让子类的原型对象指向父类实例, 这样一来在Child实例中找不到的属性和方法就会到原型对象(父类实例)上寻找
Child.prototype = new Parent()
Child.prototype.constructor = Child // 根据原型链的规则,顺便绑定一下constructor, 这一步不影响继承, 只是在用到constructor时会需要

// 然后Child实例就能访问到父类及其原型上的name属性和getName()方法
const child = new Child()
child.name          // '29'
child.getName()     // '29'

原型继承的缺点:

由于所有Child实例的隐式原型都指向同一个Parent实例, 因此对某个Child实例的父类引用类型变量修改会影响所有的Child实例
在创建子类实例时无法向父类构造传参, 即没有实现super()的功能

// 示例:
function Parent() {
   
    this.name = ['29kun'] 
}
Parent.prototype.getName = function() {
   
    return this.name
}
function Child() {
   }

Child.prototype = new Parent()
Chil
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值