instanceof 的本质是检查左侧对象的原型链是否包含右侧构造函数的 prototype;它逐级遍历 left.__proto__ 链,比对是否等于 right.prototype,原始值恒返回 false,且不检测构造函数本身。

instanceof 的本质是检查左侧对象的原型链上是否包含右侧构造函数的 prototype 对象。
核心判断逻辑
表达式 a instanceof B 的执行过程如下:
- 获取
a的隐式原型(即a.__proto__,现代等价于Object.getPrototypeOf(a)) - 逐级向上遍历该原型链
- 若某一级原型严格等于
B.prototype,返回true - 若遍历到
null(即原型链终点)仍未匹配,返回false
关键细节说明
以下行为直接影响判断结果:
-
instanceof不检测构造函数本身,只检测B.prototype是否在原型链中 - 若手动修改了对象的
__proto__或构造函数的prototype,会影响结果 - 对原始值(如
5、"hello"、true)使用instanceof总是返回false,因为它们没有原型链 - 对于通过
class定义的类,其底层仍基于函数和原型链,所以逻辑完全一致
手写简易实现参考
可借助以下代码理解其内部机制(忽略边界与 Symbol 情况):
立即学习“Java免费学习笔记(深入)”;
function myInstanceof(left, right) {
if (typeof left !== 'object' || left === null) return false;
let proto = Object.getPrototypeOf(left);
while (proto !== null) {
if (proto === right.prototype) return true;
proto = Object.getPrototypeOf(proto);
}
return false;
}
该函数模拟了标准 instanceof 的核心路径:从实例出发,沿 [[Prototype]] 链向上比对。
常见误区提醒
以下情况容易误判:
- 直接赋值
B.prototype = {}会切断原有原型链,导致之前创建的实例不再满足instanceof B - 使用
Object.create(null)创建的对象,其原型链为null,对任何构造函数都返回false -
Array instanceof Array是false,因为Array是函数,不是实例;正确写法是[] instanceof Array


















