单元测试继承链需验证三点:子类正确访问父类属性、方法沿原型链可调用、instanceof关系准确;同时检查引用属性隔离、构造参数独立传递、super()调用、原型链完整性及不同继承方式的脆弱点。

单元测试继承链的关键,不是“测语法”,而是验证三件事:子类能否正确访问父类属性、方法是否沿原型链可调用、实例关系(instanceof)是否准确。只要覆盖这三点,就抓住了 JS 继承的本质行为。
验证实例属性与构造逻辑是否隔离
重点检查引用类型属性是否不被共享,以及构造参数是否正确传递。避免用原型链继承直接初始化子类原型,否则会触发共享问题——测试本身就能暴露这个缺陷。
- 创建两个子类实例,修改其中一个的数组/对象属性,断言另一个未受影响
- 传不同参数构造多个实例,断言各自
this.name、this.age等值独立且正确 - 若使用
class,确保子类constructor中调用了super(),否则测试会直接报ReferenceError
验证方法调用与原型链查找路径
继承的方法必须能被子类实例调用,且不能污染父类原型。测试时不要只看“能运行”,要确认方法确实来自父类原型,而非重复定义在子类实例上。
- 调用子类实例的继承方法(如
child.sayName()),断言输出符合父类逻辑 - 用
console.log(child.__proto__.hasOwnProperty('sayName'))或Object.getPrototypeOf(child).hasOwnProperty('sayName')检查该方法是否在原型上,而不是实例自身 - 修改父类原型上的方法后,子类实例调用应反映新逻辑(证明原型链生效)
验证 instanceof 和原型链完整性
这是最容易被忽略但最能体现继承正确性的点。JS 的继承最终要落在 [[Prototype]] 链和 instanceof 行为上。
- 断言
child instanceof Child为true - 断言
child instanceof Parent为true(对 class 或手动设置的原型链都适用) - 用
Object.getPrototypeOf(child) === Child.prototype和Object.getPrototypeOf(Child.prototype) === Parent.prototype逐层验证链路 - 若使用
Object.setPrototypeOf手动设置,需额外断言Child.prototype.__proto__ === Parent.prototype(仅作调试参考,不用于生产断言)
针对不同继承方式的测试侧重点
不同实现方式有不同脆弱点,测试要有的放矢:
-
class + extends:重点测
super()调用时机、静态方法是否继承(Child.staticMethod())、get/set是否可重写 -
寄生组合式继承:验证
Parent.call(this)是否只执行一次、Object.create(Parent.prototype)是否避免了父构造函数重复执行 - 纯原型链继承:必须测引用属性共享问题——这是它最典型的失败场景
- 构造函数继承(仅 call):断言子类实例无法调用父类原型方法,明确其能力边界


















