js instanceof实现
instanceof 实现原理
instanceof 用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上。其核心逻辑是通过递归遍历对象的原型链,与构造函数的 prototype 属性进行比对。
手动实现代码
function myInstanceof(obj, constructor) {
// 基本类型直接返回 false
if (obj === null || typeof obj !== 'object') {
return false;
}
let proto = Object.getPrototypeOf(obj);
while (proto !== null) {
if (proto === constructor.prototype) {
return true;
}
proto = Object.getPrototypeOf(proto);
}
return false;
}
实现步骤解析
检查对象是否为基本类型:null 或非对象类型直接返回 false,因为基本类型无法通过 instanceof 检测。
获取对象的原型:使用 Object.getPrototypeOf() 获取对象的原型对象。

递归遍历原型链:通过循环不断向上查找原型链,直到找到匹配的 prototype 或到达原型链顶端(null)。
比对原型:每次遍历时检查当前原型是否等于构造函数的 prototype 属性,匹配则返回 true。

使用示例
function Person() {}
const p = new Person();
console.log(myInstanceof(p, Person)); // true
console.log(myInstanceof(p, Object)); // true
console.log(myInstanceof([], Array)); // true
console.log(myInstanceof(123, Number)); // false
注意事项
原始值检测:手动实现的 instanceof 对原始值(如 123、'str')会返回 false,与原生行为一致。
原型链修改:如果在检测过程中修改了对象的原型链,可能会影响检测结果。
跨框架对象:不同框架(iframe)中的对象可能无法正确检测,因为它们的全局环境不同。
与 typeof 的区别
typeof 返回变量类型的字符串表示,主要用于区分基本类型。
instanceof 检查对象与构造函数的关系,用于检测对象类型及继承关系。






