应优先用 instanceof 和 isPrototypeOf 验证继承关系,再测试典型原型方法调用及原型链终点是否为 Object.prototype,避免遍历所有方法。

在单元测试中验证原型链继承是否生效,关键不是“检查所有方法是否存在”,而是确认对象实例能正确沿原型链访问父类定义的公共方法,并且继承关系逻辑成立。直接遍历并断言每个方法容易遗漏边界或误判(比如同名方法被覆盖),应聚焦于原型链结构本身和典型方法调用行为。
检查 instanceof 和 isPrototypeOf 关系
这是最轻量、最可靠的断言起点,用于确认继承关系是否已建立:
-
用
instanceof验证实例是否属于父类构造函数:assert(subInstance instanceof Parent);若返回false,说明原型链未连通,后续方法调用必然失败。 -
用
Parent.prototype.isPrototypeOf(subInstance)直接检测原型链连接: 它比instanceof更底层,不依赖构造函数存在,适合测试被篡改过constructor的场景。
断言父类原型方法可被子类实例调用
选 1–2 个父类定义的典型公共方法(非私有、非 getter/setter),验证子类实例能否正常调用并返回预期结果:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 确保方法在
Parent.prototype上定义(而非构造函数内),例如:Parent.prototype.getName = function() { return this.name; }; - 在测试中创建子类实例后直接调用:
assert.strictEqual(subInstance.getName(), 'expected-name'); - 若方法内部依赖
this绑定(如访问实例自有属性),需确保子类构造函数中已通过Parent.call(this, ...)正确初始化——这本身也应是单独的测试点。
避免常见误判:不检查“所有方法”,而验证原型链终点
不必遍历 Object.getOwnPropertyNames(Parent.prototype) 并逐个断言。原因:
立即学习“Java免费学习笔记(深入)”;
- 父类原型上可能含不可枚举方法(如
toString)、内置方法或测试无关的辅助方法; - 子类可能重写部分方法,覆盖行为但不破坏继承链;
- 真正需要保障的是“可访问性”和“执行正确性”,不是“完整性清单”。
更稳妥的做法是确认链的终点:assert.strictEqual(Object.getPrototypeOf(Object.getPrototypeOf(subInstance)), Object.prototype);
这保证了原型链最终归于 Object.prototype,未意外中断或错接。
补充:测试组合继承时注意自有属性与原型方法分离
若使用组合继承(构造函数 + 原型链),需分别断言:
- 自有属性来自父类构造函数调用(如
subInstance.name存在且值正确); - 原型方法来自父类原型(如
subInstance.getName是函数且可执行); - 二者不能互相替代——例如
subInstance.name是自有属性,但subInstance.getName必须从原型链获取,否则说明SubType.prototype未正确设置。

















