JS 继承

function Father(name) {
  // 实例属性
  this.name = name
  // 实例方法
  this.sayName = function() {
    console.log(this.name)
  }
}

// 原型属性
Father.prototype.age = 19
// 原型方法
Father.prototype.sayAge = function() {
  console.log(this.age)
}

1.原型链继承

将父类的实例作为子类的原型

function Son(name) {
   this.name = name
 }
 
 Son.prototype = new Father()
 
 const son = new Son('son')
 son.sayName() // son
 son.sayAge() // 19

优点:

  1. 简单,易于实现

  2. 父类新增原型方法、原型属性,子类都能访问到

缺点:

  1. 无法实现多继承,因为原型一次只能被一个实例更改

  2. 来自原型对象的所有属性被所有实例共享

  3. 创建子类实例时,无法向父构造函数传参

2.构造继承

复制父类的实例属性给子类

 function Son(name) {
 	Father.call(this, "Son props")
   this.name = name
 }
 
 const son = new Son('son')
 son.sayName() // son
 son.sayAge() // 报错,无法继承父类原型
 console.log(son instanceof Son) // true
 console.log(son instanceof Father) // false

优点:

  1. 解决了原型链继承中实例共享父类引用属性的问题

  2. 创建子类实例时,可以向父类传参

  3. 可以实现多继承(call 多个父类对象)

缺点:

  1. 实例并不是父类的实例,只是子类的实例

  2. 只能继承父类实例属性和方法,不能继承原型属性和方法

  3. 无法实现函数复用,每个子类都有父类实例函数的副本,影响性能

 3.组合继承

将原型链和构造函数组合一起,使用原型链实现对原型属性和方法的继承,使用构造函数实现实例属性继承

function Son(name) {
   // 第一次调用父类构造器 子类实例增加父类实例
   Father.call(this, 'Son props')
   this.name = name
 }
 
 Son.prototype = new Father()
 
 const son = new Son('son')
 son.name // 'son'
 son.sayAge() // 19
 son.sayName() // 'son'
 son instanceof Son // true
 son instanceof Father // true
 son.constructor === Father // true
 son.constructor === Son // false

优点:

  1. 弥补了构造继承的缺点,可以同时继承实例属性方法和原型属性方法

  2. 既是子类的实例,也是父类的实例

  3. 可以向父类传参

  4. 函数可以复用

缺点:

  1. 调用了两次父类构造函数,生成了两份实例

  2. 构造函数(constructor)指向问题

 

4.寄生组合继承

通过寄生方式,砍掉父类的实例属性,避免组合继承生成两份实例的缺点

 function Son(name) {
   Father.call(this)
   this.name = name
 }
 
 Son.prototype = Object.create(Father.prototype)
 Son.prototype.constructor = Son
 
 const son = new Son('son')
 son.sayAge // 19
 son.sayName // son
 son instanceof Father // true
 son instanceof Son // true
 son.constructor === Father // false
 son.constructor === Son // true

 优点:

  1. 比较完美(js 实现继承首选方式)

缺点:

  1. 实现方式较为复杂

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值