instanceof 运算的本质是原型链上的“身份追溯”,只判断右侧构造函数的 prototype 是否在左侧对象的原型链上,与 constructor 属性无关;其核心逻辑是沿 proto 向上遍历比对地址,直至 null。

instanceof 运算的本质,是原型链上的“身份追溯”——它不看构造函数名、不依赖 constructor 属性,只认一个事实:右侧构造函数的 prototype 对象,是否在左侧对象的原型链上真实存在。
核心判断逻辑:沿着 __proto__ 一路向上找
JavaScript 引擎执行 a instanceof B 时,实际做的是:
- 先取
B.prototype(B 的显式原型对象) - 再取
a.__proto__(a 的隐式原型) - 若两者相等,立刻返回 true
- 若不等,就继续取
a.__proto__.__proto__,再比……如此循环 - 直到某次
__proto__为null,说明链已到顶,返回 false
constructor 属性完全不影响结果
很多人误以为 instanceof 是靠 obj.constructor === C 判断的,其实不是。即使你手动改写:
只要 O.prototype 本身还在对象的原型链上,new O() instanceof O 依然为 true。反过来,如果把 O.prototype 整个替换成新对象(比如 O.prototype = {}),哪怕 constructor 没动,instanceof 也会立即失效。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
为什么数组、日期能被正确识别
typeof [] 返回 "object",无法区分;但 [] instanceof Array 能返回 true,原因在于:
- 数组实例的
__proto__直接指向Array.prototype - 而
Array.prototype.__proto__又指向Object.prototype,所以[] instanceof Object也是 true - 这种层级关系由引擎在创建内置类型时固化,不可绕过
手写实现帮你看清骨架
下面是最简但完整的模拟逻辑(避开边界细节,聚焦主干):
function myInstanceof(obj, ctor) {if (obj == null || typeof obj !== 'object' && typeof obj !== 'function') return false;
let proto = Object.getPrototypeOf(obj);
const target = ctor.prototype;
while (proto) {
if (proto === target) return true;
proto = Object.getPrototypeOf(proto);
}
return false;
}
这段代码没有魔法,只有两件事:取原型、比地址、跳下一级——这就是 instanceof 全部的骨架。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










