instanceof 本质是沿左侧对象的 proto 链查找右侧构造函数的 prototype;不依赖 constructor 属性;可被 Symbol.hasInstance 自定义;跨 iframe 时因构造函数不等而失效。

instanceof 的本质是沿着左侧对象的 __proto__ 链向上查找,看能否找到右侧构造函数的 prototype 对象。
原型链查找过程
当执行 a instanceof B 时,JavaScript 引擎会:
- 获取
a.__proto__(即a的内部原型) - 检查它是否等于
B.prototype - 如果不相等,继续取
a.__proto__.__proto__,重复比对 - 直到找到匹配项(返回
true),或到达原型链末端(null,返回false)
与 constructor 属性无关
instanceof 不检查对象自身的 constructor 属性,也不依赖该属性是否被修改。例如:
function Foo() {}
const f = new Foo();
f.constructor = String; // 手动篡改
console.log(f instanceof Foo); // true —— 仍基于原型链判断
Symbol.hasInstance 可自定义行为
若右侧函数有静态方法 [Symbol.hasInstance],引擎会优先调用它:
立即学习“Java免费学习笔记(深入)”;
- 例如:
Array[Symbol.hasInstance]([])返回true - 可重写该方法改变 instanceof 的逻辑,如用于类型伪装或调试代理
注意事项
跨全局环境(如 iframe)中,不同上下文的内置构造函数互不相等:
iframe.contentWindow.Array !== Array- 因此
iframeArray instanceof Array为false - 此时应改用
Array.isArray()或检查toString.call()










