instanceof 用于检测对象原型链上是否存在构造函数的 prototype,即从 object.__proto__ 开始向上查找是否与 constructor.prototype 全等;返回布尔值,支持内置类型、自定义类及继承判断,但在跨 iframe 时因原型隔离可能失效。

instanceof 用于检测一个对象是否在其原型链上存在某个构造函数的 prototype 对象,本质是判断「对象的 __proto__ 链能否向上找到构造函数的 prototype」。
基本语法和工作原理
写法:object instanceof Constructor,返回布尔值。
执行时,JavaScript 引擎会从 object.__proto__ 开始,逐级向上查找,直到:
- 找到与
Constructor.prototype全等(===)的对象 → 返回true; - 查到原型链顶端(
null)仍未匹配 → 返回false。
常见使用场景
✅ 判断内置类型(注意:对字面量需谨慎):
-
[] instanceof Array→true -
new Date() instanceof Date→true -
new Map() instanceof Map→true
⚠️ 字面量如 {}、[]、/regex/ 虽是对象,但 instanceof 仍可正常工作,因为它们有对应的构造器原型链;但 42 instanceof Number 是 false(数字字面量不是 Number 实例,除非显式用 new Number(42))。
跨执行上下文的限制
在 iframe 或不同 window 中创建的对象,其构造函数与当前环境的同名构造函数不共享原型(即使名字一样),instanceof 会返回 false:
- 比如
iframe.contentWindow.Array和主窗口的Array是两个不同函数; -
arr instanceof iframe.contentWindow.Array可能为true,但arr instanceof Array(主窗口)可能为false。
此时建议改用 Object.prototype.toString.call(obj) 做类型识别。
自定义类与继承中的用法
ES6 类也支持 instanceof,且能正确识别继承关系:
class Animal {}
class Dog extends Animal {}
const dog = new Dog();
dog instanceof Dog; // true
dog instanceof Animal; // true
dog instanceof Object; // true(所有对象最终继承自 Object)
只要原型链中存在对应构造函数的 prototype,就返回 true。这使得它非常适合做多态判断或运行时类型分发。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











