最优继承:寄生组合继承

365 阅读1分钟
个人学习笔记,欢迎大佬们纠错
// 寄生组合继承
function Person(name) {
  this.name = name
}
Person.prototype.say = function () {
  console.log(`Hi! I‘m ${this.name}`)
}

function Man(name, age) {
  Person.call(this, name)
  this.age = age
}

// Man.prototype = Person.prototype  引用类型直接赋值相互影响 no
// Man.prototype = new Person()      子类原型上除了共享父类原型上的方法,还写入了父类里的属性 no
// so 需要一个实例对象共享了父类原型,但这个对象里没有其他属性和方法污染子类原型对象(Object.create())
// Object.create()实现原理:
// function objectCreate(obj) {
//   let F = function () {}
//   F.prototype = obj.prototype
//   return new F()
// }

function inherit(sup, sub) {
  let prototype = Object.create(sup.prototype)  // 这就是我们要的纯洁的实例对象,把它赋值给子类的prototype原型对象就ok啦
  sub.prototype = prototype
  prototype.constructor = sub                   // 原型对象上默认的constructor属性指向的是创建这个实例对象的构造函数,so 为了避免可能存在的麻烦加上比较好
}

inherit(Person, Man)

Man.prototype.sayAge = function () {
  console.log(`I'm ${this.age}`)
}
Man.prototype.sex = 'Male'

let Mike = new Man('Mike', 18)
Mike.say()
Mike.sayAge()