instanceof 的判断结果实时依赖对象当前原型链结构,每次执行都从 obj.__proto__ 开始逐级比对,不缓存结果;原型链可被动态修改,跨全局环境或 null/原始值会破坏链连通性。

instanceof 的判断结果不是静态快照,而是实时依赖对象当前的原型链结构。只要原型链发生变动,instanceof 的结果就可能立即改变。
原型链可被动态修改
JavaScript 中对象的 __proto__ 属性和构造函数的 prototype 属性都不是只读的(除严格模式下部分限制外),允许运行时调整。
- 直接赋值修改实例的
__proto__,会立刻影响后续 instanceof 判断 - 替换构造函数的
prototype,会使所有已存在实例脱离原继承关系 - 用
Object.setPrototypeOf(obj, newProto)替换原型,效果等同于直接改__proto__
instanceof 始终走实时查找路径
每次执行 obj instanceof Ctor,引擎都从 obj.__proto__ 开始,逐级向上比对是否等于 Ctor.prototype,直到遇到 null 为止。
- 不缓存结果,也不记录“创建时的类型”,只看此刻链上是否存在匹配节点
- 若中途某层原型被设为
null或指向新对象,查找路径即刻改变 - 例如:将
Array.prototype改为{}后,[] instanceof Array将返回false
跨全局环境导致链断裂
不同 iframe 或 window 中定义的相同构造函数(如 Array),其 prototype 是不同对象,彼此原型链互不连通。
-
iframe.contentWindow.Array !== Array,所以arr instanceof iframe.contentWindow.Array为false - 即便两个构造函数逻辑一致,只要不在同一条原型链上,instanceof 就无法识别
- 这种断裂是原型链动态性的延伸表现——链的“连通性”由内存地址决定,而非名称或行为
null 和原始值的确定性边界
instanceof 对非对象值有明确约定,体现其对原型链起点的刚性要求。
-
null没有__proto__,链不存在,结果恒为false - 数字、字符串等原始值不是对象,不能参与原型链查找,调用
instanceof会先被装箱,但装箱后的新对象仍遵循当前原型链规则 - 例如:
"hello" instanceof String为true,但String.prototype = null后,该表达式变为false


















