javascript继承链单元测试需验证三类关系:instanceof判断、原型链可达性及constructor/__proto__正确性;须覆盖多层继承、super调用、引用属性隔离等场景。

验证 JavaScript 继承链的单元测试,核心是检查三类关键关系是否按预期建立:实例与构造函数的 instanceof 关系、原型链上的属性/方法可访问性、以及 constructor 指针和 __proto__ 链的正确性。不依赖运行时黑盒行为,而是聚焦可断言的结构事实。
验证 instanceof 和原型链可达性
这是最直观的继承验证点。子类实例必须能通过 instanceof 判断为父类(及祖先类)的实例,且能调用父类原型上的方法。
- 用
expect(childInstance instanceof Parent).toBe(true)断言继承关系成立 - 显式调用父类原型方法(如
childInstance.sayName()),确认未报TypeError - 对多层继承(
A → B → C),需逐级验证:c instanceof B、c instanceof A、c instanceof Object
检查 prototype 链和 constructor 指针
手动设置原型链(如 Object.setPrototypeOf(Child.prototype, Parent.prototype))后,容易遗漏 constructor 修复,导致新建实例的 constructor 指向错误。
- 断言
Child.prototype.constructor === Child(而非Parent) - 验证
Child.prototype.__proto__ === Parent.prototype(或使用Object.getPrototypeOf(Child.prototype)) - 检查实例的隐式原型:
Object.getPrototypeOf(childInstance) === Child.prototype
覆盖 super() 调用与 this 初始化场景
对 class extends 写法,super() 是否被调用、是否在访问 this 前执行,直接决定实例能否创建成功。
- 用
expect(() => new Child('x')).not.toThrow()确保构造函数不崩溃 - 若父类构造函数有副作用(如初始化
this.id),断言子类实例确实拥有该属性:expect(child.id).toBeDefined() - 对未调用
super()的非法子类,应明确捕获并验证错误类型:expect(() => new BadChild()).toThrow(/Must call super constructor/)
隔离测试引用属性共享问题
原型链继承易导致数组/对象等引用类型被所有实例共享,这是典型 bug 源头,需专门验证。
- 创建两个子类实例:
const c1 = new Child(); const c2 = new Child(); - 修改其中一个的引用属性:
c1.data.push('item') - 断言另一个不受影响:
expect(c2.data).not.toContain('item') - 若发现共享,说明用了
Child.prototype = new Parent()而非组合继承或Object.create(Parent.prototype)











