原型链继承/借用构造函数继承/组合式继承/寄生继承/es6类继承

继承

子类能够使用父类的属性和方法

原型链继承

  1. 创建人的类

    function Person(name, age) {
      this.name = name
      this.age = age
    }
    
    Person.prototype.say = function () {
      console.log('说话了')
    }
    
    const p1 = new Person('张三', 19)
    
  2. 创建狗的类

    function Dog(name, age) {
      this.name = name
      this.age = age
    }
    
    Dog.prototype.say = function () {
      console.log('说话了')
    }
    
    const d1 = new Dog('大黄', 3)
    
  3. 狗继承自人的类

    // 创建人的类
    function Person(name, age) {
      this.name = name
      this.age = age
    }
    
    Person.prototype.say = function () {
      console.log('说话了')
    }
    function Dog() {
    }
    
    // 此方式不推荐 子原型和父原型公用同一个原型
    // Dog.prototype = Person.prototype
    Dog.prototype = new Person()
    
    const d1 = new Dog('大黄', 3)
    

以上则实现原型链继承但是会有以下问题:

  • 包含引用类型值的原型属性会被所有的实例共享

    function Person(name, age) {
      this.name = name
      this.age = age
      this.hobby = []
    }
    
  • 创建子类的时候不能传递参数

借用构造函数继承

  1. 创建人的类

    // 创建人的类
    function Person(name, age) {
      this.name = name
      this.age = age
      this.hobby = []
    }
    
  2. 通过call实现

    function Dog(name, age) {
      Person.call(this, name, age)
    }
    
    const d1 = new Dog('大黄', 2)
    const d2 = new Dog('小黄', 1)
    d1.hobby = '吃吃吃'
    

组合式继承

// 创建人的类
function Person(name, age) {
  this.name = name
  this.age = age
}

Person.prototype.say = function () {
  console.log('说话了')
}
function Dog(name,age) {
  Person.call(this,name,age)
}

// 此方式不推荐 子原型和父原型公用同一个原型
// Dog.prototype = Person.prototype
Dog.prototype = new Person()

const d1 = new Dog('大黄', 3)
const d2 = new Dog('小黄', 2)

寄生式组合继承

Object.create作用:

  1. 创建对象
  2. 将对象的__proto__ 指向参数对象
// 创建人的类
function Person(name, age) {
  this.name = name
  this.age = age
}

Person.prototype.say = function () {
  console.log('说话了')
}
function Dog(name,age) {
  Person.call(this,name,age)
}

// 此方式不推荐 子原型和父原型公用同一个原型
// Dog.prototype = Person.prototype
Dog.prototype = Object.create(Person.prototype)

const d1 = new Dog('大黄', 3)
const d2 = new Dog('小黄', 2)

es6类继承

class Person {
  say () {
    console.log('说话了')
  }
}

class Child extends Person {
}

const child = new Child()
child.say()
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值