继承模式

继承是子类对象能够使用父类对象的数据和行为

  • 原型链继承

    • 创建过程
      1. 定义父类型的构造函数
      2. 给父类型构造函数的原型添加公有方法
      3. 定义子类型的构造函数
      4. 创建父类型的对象赋值给子类型的原型
      5. 把子类原型的构造属性设置为子类型
      6. 给子类型的原型添加方法
      7. 创建子类型的对象:可以调用到父类型的方法
    • 关键点:子类型的原型为父类型的一个实例对象
function Supper() { //父类型
    this.superProp = 'The super prop'
}
//原型的数据所有的实例对象都可见
Supper.prototype.showSupperProp = function () {
    console.log(this.superProp)
}

function Sub() { //子类型
    this.subProp = 'The sub prop'
}

// 子类的原型为父类的实例
Sub.prototype = new Supper()
// 修正Sub.prototype.constructor为Sub本身
Sub.prototype.constructor = Sub

Sub.prototype.showSubProp = function () {
    console.log(this.subProp)
}

// 创建子类型的实例
var sub = new Sub()
// 调用父类型的方法
sub.showSubProp()
// 调用子类型的方法
sub.showSupperProp()
  • 借用构造函数继承

    • 创建过程
      1. 定义父类型构造函数
      2. 定义子类型构造函数
      3. 在子类型构造函数中调用父类型构造
    • 关键点:在子类型构造函数中通用super()调用父类型构造函数
function Person(name, age) {
    this.name = name
    this.age = age
  }

  function Student(name, age, price) {
    Person.call(this, name, age)   // this.Person(name, age)
    this.price = price
  }

  var s = new Student('Tom', 20, 12000)
  console.log(s.name, s.age, s.price)
  • 原型链+借用构造函数的组合继承

    利用原型链实现对父类型对象的方法继承

    利用super()借用父类型构建函数初始化相同属性

    function Person(name, age) {
        this.name = name
        this.age = age
    }
    Person.prototype.setName = function (name) {
        this.name = name
    }
    
    function Student(name, age, price) {
        Person.call(this, name, age) //得到父类型的属性
        this.price = price
    }
    Student.prototype = new Person()  //得到父类型的方法
    Student.prototype.constructor = Student
    Student.prototype.setPrice = function (price) {
        this.price = price
    }
    
    var s = new Student('Tom', 12, 10000)
    s.setPrice(11000)
    s.setName('Bob')
    console.log(s)
    console.log(s.constructor)

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!

对象的创建模式 下一篇