instanceof 通过检查左侧对象原型链是否包含右侧构造函数的 prototype 来判断关系;其核心是沿 [[Prototype]] 向上查找,匹配 right.prototype,与构造函数名或 new 调用无关。

instanceof 通过检查左侧对象的原型链中是否包含右侧构造函数的 prototype 对象来判断关系。
核心原理:沿着 __proto__ 向上查找
当执行 a instanceof B 时,JavaScript 引擎会:
- 获取
B.prototype的引用(注意:是构造函数B的prototype属性,不是实例的) - 从
a的内部属性[[Prototype]](即a.__proto__)开始,逐级向上遍历原型链 - 只要某一级等于
B.prototype,就返回true;直到到达null还没找到,就返回false
只认 prototype,不认构造函数本身
instanceof 检查的是原型对象是否在链上,和构造函数名、是否调用过 new 没有直接关系。例如:
-
let obj = {}; obj instanceof Object→true(因为obj.__proto__ === Object.prototype) -
let arr = []; arr instanceof Array→true(arr.__proto__ === Array.prototype) -
let fn = function(){}; fn instanceof Function→true(函数也是对象,其__proto__指向Function.prototype)
手写一个简易 instanceof 实现
有助于理解底层逻辑:
立即学习“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;
}
这个实现模拟了真实行为:用 Object.getPrototypeOf() 替代 __proto__,安全地沿链向上比对。
注意边界情况
某些场景下结果可能反直觉:
-
Object instanceof Object→true(因为Object.__proto__ === Function.prototype,而Function.prototype.__proto__ === Object.prototype,所以Object.prototype在链上) -
Function instanceof Function→true(同理,Function.prototype在自己的原型链上) -
class A {}; let a = new A(); a instanceof A→true(ES6 class 底层仍是函数,A.prototype被正确设置)


















