手写继承题核心是实现属性独立与方法复用:子实例需独有属性(避免引用类型共享),同时能调用父类原型方法;推荐寄生组合继承——用Parent.call(this)初始化属性,Object.create(Parent.prototype)挂载方法并修复constructor。

手写继承题不是考你背代码,而是考你是否真正理解“属性独立”和“方法复用”这两个核心目标。只要抓住这个逻辑,一次写对并不难。
必须同时解决两个问题
子类实例要拥有自己的属性(尤其是数组、对象等引用类型),不能互相影响;同时又能调用父类原型上的方法(比如 speak()、sayHi())。只做一半就容易出错。
- 只用 Parent.call(this) → 能隔离属性,但无法访问 Parent.prototype 上的方法
- 只改 Child.prototype = new Parent() → 方法能用,但所有子实例共享父类的引用属性(比如 this.colors = ['red'])
推荐直接写寄生组合继承(面试最稳)
这是 ES6 class extends 的底层实现,也是《JavaScript 高级程序设计》明确推荐的方案。它把上面两个问题一次性解干净:
- 用 Parent.call(this, ...args) 给每个子实例初始化独有属性
- 用 Object.create(Parent.prototype) 挂载父类原型方法,不执行父构造函数
- 手动修复 constructor 指向,避免 instance.constructor === Parent 这种意外
写的时候盯住三处关键点
边写边核对,基本不会漏:
立即学习“Java免费学习笔记(深入)”;
- 子构造函数里第一句必须是 Parent.call(this, ...)(传参别漏)
- 设置原型链必须用 Object.create(Parent.prototype),绝不能写 Child.prototype = Parent.prototype 或 new Parent()
- 紧跟着补上 Child.prototype.constructor = Child,否则 instanceof 和 constructor 判断会出错
ES6 class 写法也要会默写(加分项)
如果题目没限定“不用 class”,优先写这个。它更简洁,且自动处理了 super()、constructor 修复、静态方法继承等细节:
- 子类 constructor 中必须第一行调用 super(...)
- 不写子类 constructor 时,引擎会自动补一个 constructor(...args) { super(...args); }
- 重写方法直接写同名函数,想调父类版本就用 super.methodName()


















