组合继承通过构造函数借用实现属性私有化、原型链继承实现方法共享:子类构造函数中调用Parent.call(this, ...args)确保实例属性独立;Child.prototype = Object.create(Parent.prototype)并修复constructor,使instanceof校验通过且方法复用。

组合继承通过两步分工,把属性和方法的继承问题拆开解决:实例属性靠构造函数借用,方法复用靠原型链连接。
怎么让每个实例拥有独立的属性?
在子类构造函数里,用 Parent.call(this, ...args) 显式调用父类构造函数。这样每次 new 子类时,都会执行一遍父类初始化逻辑,给当前 this 挂上属于自己的属性副本。
- 比如父类有 this.colors = ['red'],子类两个实例修改 colors 不会互相影响
- 能正常接收并传递初始化参数,如 new Child('Alice', 25)
- 这一步只处理实例上的属性,不涉及父类原型上的方法
怎么让所有实例共享同一套方法?
把子类的 prototype 设为父类原型的一个干净副本,推荐写法是:Child.prototype = Object.create(Parent.prototype)。
使用约定式提交(Conventional Commits)生成标准化的 Git 提交信息。适用于以下场景: (1) 暂存更改时需要提交信息; (2) 审查 diff 时希望获得结构化摘要; (3) 编写 PR 描述或变更日志(changelog)条目; (4) 用户明确要求“为本次更改编写提交信息”。 该功能会分析已暂存/未暂存的 diff,并生成按类型(type)划分范围的提交信息。
- 这样子类实例就能沿原型链访问 Parent.prototype 上的所有方法,比如 sayName()
- 必须手动修复 constructor:Child.prototype.constructor = Child,否则 instance.constructor 会指向 Parent
- 不能直接写 Child.prototype = Parent.prototype,否则改子类原型会影响父类
为什么这样比单用一种方式更可靠?
单用原型链继承,引用类型属性(如数组、对象)会被所有实例共享;单用构造函数继承,方法无法复用,每个实例都存一份副本,而且 instanceof 判定会失败。
- 组合继承补上了这两块短板:属性私有、方法共用
- child instanceof Parent 和 child instanceof Child 都返回 true
- ES6 的 class 和 extends 底层正是基于这个思路实现的
实际写的时候容易漏掉什么?
组合继承结构固定,缺一不可:
- 子类构造函数内部必须调用 Parent.call(this, args)
- 子类原型赋值要在构造函数定义之后、实例化之前完成
- 用 Object.create(Parent.prototype) 比 new Parent() 更安全,避免父类构造函数被意外执行两次
- constructor 指针修复不是可选项,而是调试和类型识别的关键

















