instanceof 通过检查构造函数的 prototype 是否在对象原型链上判断继承关系;它沿 proto 查找 constructor.prototype,匹配则返回 true,否则 false;基本类型、跨上下文及原型链修改均会导致误判。

instanceof 通过检查**构造函数的 prototype 是否出现在对象的原型链上**来判断关系。
核心原理:沿着 __proto__ 向上查找
当执行 obj instanceof Constructor 时,JavaScript 引擎会:
- 获取
Constructor.prototype的值(注意:是这个属性本身,不是它的原型) - 从
obj.__proto__开始,逐级向上比对(obj.__proto__ === Constructor.prototype?),直到找到匹配或到达null - 只要某一级相等,就返回
true;遍历完都没匹配,返回false
常见易错点
这些情况容易误判,需特别注意:
-
基本类型值不能用 instanceof 检测:如
"hello" instanceof String是false,因为字面量字符串不是String实例(除非显式用new String("hello")) -
跨执行上下文失效:iframe 或不同 window 中创建的数组,用另一个 window 的
Array检测会返回false,因为它们的Array.prototype不是同一个对象 -
手动修改原型链会影响结果:比如
obj.__proto__ = null后,任何instanceof都为false
替代方案与补充建议
遇到上述限制时,可考虑更稳妥的方式:
- 检测内置类型优先用
Object.prototype.toString.call(obj),如[object Array] - 自定义类之间关系明确时,可用
obj.constructor === MyClass(但constructor可被改写,不绝对可靠) - 需要严格判断原型链存在性,可手写循环遍历
__proto__,或用Object.getPrototypeOf()
它不依赖对象自身的属性,只看原型链结构,所以本质是“继承关系”的运行时验证。理解清楚 prototype 和 __proto__ 的分工,就掌握了关键。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











