寄生组合式继承是JavaScript模拟类式继承的推荐方式,通过Object.create(Parent.prototype)创建子类原型并修正constructor,再在子类构造函数中用Parent.call(this)继承实例属性,避免原型污染和冗余执行。

寄生组合式继承是 JavaScript 中模拟类式继承的推荐方式,核心在于复用父类构造函数初始化实例属性,同时让子类原型正确指向父类原型以共享方法,避免重复创建父类实例或污染原型。
正确设置子类原型链
关键步骤是用 Object.create(Parent.prototype) 创建干净的子类原型对象,再把 constructor 指回子类。不能直接赋值 Parent.prototype,否则会丢失子类自己的方法;也不能用 new Parent(),否则会执行父类构造逻辑并可能产生副作用。
- 子类原型 = Object.create(Parent.prototype)
- 子类原型.constructor = Child
- 子类.prototype = 子类原型
调用父类构造函数初始化实例属性
在子类构造函数中,用 Parent.call(this, ...args) 继承父类的实例属性(如 this.name、this.age)。这确保每个子类实例拥有独立的属性副本,不与其它实例共享。
- 避免在子类中重复定义父类已有的实例属性
- 参数需按父类构造函数签名传递,保持兼容性
- 调用必须在子类 this 初始化之后、添加子类特有属性之前
避免常见错误写法
以下写法不符合规范:直接 Child.prototype = Parent.prototype(导致修改子类原型影响父类);Child.prototype = new Parent()(执行父类构造,可能报错或产生冗余状态);忘记修复 constructor(导致 instance.constructor 指向 Parent)。
- 不覆盖 Parent.prototype,只借用其结构
- 不依赖 __proto__ 或 setPrototypeOf(兼容性和性能不佳)
- ES6 class 内部已自动实现该模式,手写时需严格遵循逻辑
结合实际场景补充方法
子类原型上可安全添加自有方法,不影响父类。若需重写父类方法,应在 Object.create 后再定义,确保方法查找链正常:子类实例 → 子类原型 → 父类原型。
- 子类特有方法直接挂载到子类.prototype 上
- 重写方法时可用 super.methodName.call(this) 调用父类版本
- 静态方法需单独赋值给子类本身,不参与原型链

















