instanceof 运算符通过检查对象原型链是否包含构造函数的 prototype 来判断实例关系;执行时从 obj.__proto__ 开始逐级向上严格比较,找到则返回 true,至 null 未找到则返回 false。

instanceof 运算符通过检查对象的原型链中是否包含构造函数的 prototype 对象,来判断该对象是否为该构造函数的实例。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
instanceof 的工作原理
当执行 obj instanceof Constructor 时,JavaScript 引擎会:
- 从 obj.__proto__ 开始,沿着原型链向上查找;
- 每次比较当前原型对象是否严格等于 Constructor.prototype;
- 如果找到匹配,返回 true;如果查到原型链顶端(null)仍未找到,返回 false。
常见使用场景与注意事项
- 检测内置类型:如
[] instanceof Array返回true,{} instanceof Object也返回true(因为普通对象原型链最终指向Object.prototype) - 检测自定义类/构造函数:
function Animal() {}function Dog() {}Dog.prototype = Object.create(Animal.prototype);const dog = new Dog();dog instanceof Dog; // truedog instanceof Animal; // true - 不能跨执行上下文使用:比如 iframe 中创建的数组,用主页面的
Array检测会返回false,因为两个Array.prototype不是同一个对象 - 对原始值无效:如
5 instanceof Number是false,因为原始数字没有原型链;包装对象才有效:new Number(5) instanceof Number为true
替代方案与补充说明
当需要更可靠地判断类型时,可结合其他方法:
- Object.prototype.toString.call(value) 可精确识别内置类型(如 [object Array])
- value.constructor === SomeClass 仅适用于未修改 constructor 属性的情况,且不沿原型链查找
- ES6 后推荐优先使用 class 语法,其 instanceof 行为与传统构造函数一致,语义更清晰
原型链断裂会影响 instanceof 判断
如果手动重写原型但忘记修复 constructor 或破坏链路,可能导致意外结果:
function A() {}A.prototype = { foo: 1 }; // 断开与 Object.prototype 的连接,且丢失 constructorconst a = new A();a instanceof A; // true(仍能访问到新 prototype)a instanceof Object; // false(因为新 prototype 没有 __proto__ 指向 Object.prototype)
正确做法是用 Object.create(A.prototype) 或确保新原型链完整。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










