原则: 子类可以继承父类,但不能影响父类

es5 继承

构造函数继承:

通过 call 或者 apply 改变 this 指向

原型链继承:

  1. Child.prototype = Parent.prototype ❌ 引用传递,子类原型的改变会引起父类原型的改变
  2. Object.assign(Child.prototype, Parent.prototype) ✅ 父类的原型合并到子类原型,不影响父类
  3. Child.prototype = new Parent() ✅ 父类的实例给子类的原型,需要把子类的构造函数改回来

    Child.prototype.constructor = Child

  1. // 父类的实例给子类的原型,为什么需要把子类的构造函数改回来?
  2. const p1 = new Parent();
  3. p1.__proto__ = Parent.prototype;
  4. p1.__proto__.constructor = Parent.prototype.constructor = Parent;