可通过instanceof或遍历原型链判断类的继承关系:instanceof适用于实例对象,检查其__proto__链是否包含目标类的prototype;判断类B是否继承自类A,应遍历B.prototype.__proto__链并比对A.prototype。

可以通过 instanceof 操作符或检查原型链来判断两个类之间是否存在祖先继承关系。核心思路是:若类 B 继承自类 A(直接或间接),则 A 的构造函数会出现在 B.prototype 的原型链上。
使用 instanceof 检测实例与类的关系
instanceof 适用于已知实例对象的场景,它内部就是沿着对象的 __proto__ 链向上查找是否匹配右侧构造函数的 prototype:
- 若
obj instanceof A为true,说明obj的原型链中包含A.prototype,即A是obj构造函数的祖先(含自身) - 注意:
instanceof检查的是“实例是否由某类(或其子类)创建”,不是直接比较两个类本身 - 例如:
class B extends A {},则new B() instanceof A === true
直接比较两个类:检查 B.prototype 是否继承自 A
要判断类 B 是否继承自类 A(即 A 是 B 的祖先类),可手动遍历 B.prototype.__proto__ 链:
- 从
B.prototype开始,不断访问__proto__,直到为null - 若途中某个对象等于
A.prototype,则存在继承关系 - 封装成工具函数更实用:
<code>function isSubclassOf(subClass, superClass) {<br> if (typeof subClass !== 'function' || typeof superClass !== 'function') return false;<br> let proto = subClass.prototype;<br> while (proto) {<br> if (proto === superClass.prototype) return true;<br> proto = Object.getPrototypeOf(proto);<br> }<br> return false;<br>}<br>// 使用示例:<br>class A {}<br>class B extends A {}<br>isSubclassOf(B, A); // true</code>
利用 constructor 属性和原型链的注意事项
不要依赖 constructor 属性做判断,因为:
- 子类原型上的
constructor可能被显式修改,不再指向原构造函数 - ES6 class 中
B.prototype.constructor === B是默认行为,但不反映继承路径 - 正确方式始终是比对
prototype对象本身,而非constructor
特殊情况:内置类与 Symbol.hasInstance 自定义
极少数情况下,类可能重写 [Symbol.hasInstance] 方法,影响 instanceof 行为:
- 此时
instanceof结果由该方法逻辑决定,不一定反映真实原型链 - 如需绕过自定义逻辑、只看原始原型链,应使用
Object.getPrototypeOf()手动遍历 - 一般业务代码无需处理此情况,但调试或框架开发时需留意
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











