instanceof的核心逻辑是沿左侧对象的__proto__链向上查找,判断是否包含右侧构造函数的prototype对象;它不比较构造函数本身,与constructor属性无关。

instanceof 的核心逻辑是:**沿着左侧对象的 __proto__ 链向上查找,看能否找到右侧构造函数的 prototype 对象**。它本质上是手动遍历原型链的判断过程。
关键点:不是比对构造函数,而是比对原型对象
注意:a instanceof B 判断的是 a 的原型链上是否存在 B.prototype,和 a.constructor === B 无关(constructor 可被改写,不可靠)。
模拟实现步骤
手动模拟时需处理几个细节:
将一个或多个视频上传至YouTube。当用户想“上传到YouTube”“发YouTube”“批量上传”“upload to YouTube”“post videos to YouTube”或发布到YouTube时使用此技能。
- 左侧必须是对象(
null和原始值直接返回false) - 右侧必须是函数(否则
prototype无意义,规范中会抛TypeError;模拟时可选择报错或返回false) - 从
left.__proto__开始,逐级向上比对是否等于right.prototype - 遇到
null(即到达原型链顶端)还没找到,就返回false
基础模拟代码
下面是一个符合 ES 规范行为的简化实现(不抛错,对非函数右操作数返回 false):
function myInstanceof(left, right) {
if (left == null || typeof left !== 'object') return false;
if (typeof right !== 'function') 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__?
__proto__ 是非标准但广泛支持的访问器属性,而 Object.getPrototypeOf() 是标准、安全、不可被覆盖的方式。在真实引擎中,instanceof 使用的是内部方法 [[GetPrototypeOf]],等价于后者。
几个典型验证例子
可以验证模拟是否正确:
-
myInstanceof([], Array)→true -
myInstanceof({}, Object)→true -
myInstanceof(Object.create(null), Object)→false(原型链为null) -
myInstanceof('hello', String)→false(字符串字面量是原始值) -
myInstanceof(new String('hello'), String)→true

















