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