Loading

ES5实现继承

继承的含义

父类公有属性和方法为子类公有属性和方法
父类私有属性和方法为子类私有属性和方法

原型链继承 + 构造函数继承 = 组合继承

  • 构造函数继承继承不到父类原型上的属性和方法
  • 原型链继承父类的修改会影响子类的实例

结合二者

function Father(name) {
    this.name = name
}
Father.prototype.printName = function () {
    console.log(this.name)
}

// 构造函数继承
function Son(name, age) {
    Father.call(this, name)
    this.age = age
}

// 原型链继承
Son.prototype = new Father()
Son.prototype.constructor = B

let test = new Son('123', 0)
test.printName() // 123

寄生式组合继承

我们注意到组合继承在son继承父类的prototype对父类进行了实例化new Father()
为了避免这个 再次改进

function Father(name) {
    this.name = name
}
Father.prototype.printName = function () {
    console.log(this.name)
}

function Son(name, age) {
    Father.call(this, name)
    this.age = age
}
Son.prototype = Object.create(Father.prototype, {
    constructor: { // 让Son.prototype上的constructor指向自己
        value: Son,
        enumerable: false, // 不可枚举
        writable: true,
        configurable: true
    }
})

let a = new Son('123', 0)
a.printName() // 123
posted @ 2021-01-20 22:21  不吃苦瓜^  阅读(139)  评论(0编辑  收藏  举报