js实现intanceof
实现 instanceof 的原理
instanceof 运算符用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上。手动实现时需要遍历对象的原型链,与构造函数的 prototype 进行比较。
基本实现代码
function myInstanceof(obj, constructor) {
let proto = Object.getPrototypeOf(obj)
const prototype = constructor.prototype
while (proto !== null) {
if (proto === prototype) {
return true
}
proto = Object.getPrototypeOf(proto)
}
return false
}
边界情况处理
原始值类型直接返回 false:
function myInstanceof(obj, constructor) {
if (obj === null || typeof obj !== 'object') {
return false
}
let proto = Object.getPrototypeOf(obj)
const prototype = constructor.prototype
while (proto !== null) {
if (proto === prototype) {
return true
}
proto = Object.getPrototypeOf(proto)
}
return false
}
使用示例
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 的区别
原生 instanceof 会检查 Symbol.hasInstance 方法,如果构造函数有这个静态方法,会调用它来判断。完整实现需要考虑这个特性:

function myInstanceof(obj, constructor) {
if (typeof constructor !== 'function') {
throw new TypeError('Right-hand side of instanceof is not callable')
}
if (typeof constructor[Symbol.hasInstance] === 'function') {
return constructor[Symbol.hasInstance](obj)
}
if (obj === null || typeof obj !== 'object') {
return false
}
let proto = Object.getPrototypeOf(obj)
const prototype = constructor.prototype
while (proto !== null) {
if (proto === prototype) {
return true
}
proto = Object.getPrototypeOf(proto)
}
return false
}
性能考虑
原型链可能很长,遍历会影响性能。实际应用中应避免过深的原型链设计。






