手写instanceof运算符:深入理解原型链检测机制,掌握类型判断原理
大家好啊,我是全栈老李。今天咱们来聊聊JavaScript中一个看似简单实则暗藏玄机的小东西——instanceof
运算符。这东西平时用起来挺顺手,但真要让你手写一个,估计不少同学都得挠头。别急,跟着老李的思路走,保证让你彻底搞明白。
先说说instanceof
是干嘛的。简单来说,它就是用来检查一个对象是不是某个构造函数的实例。比如:
function Person() {
}
const p = new Person()
console.log(p instanceof Person) // true
看起来挺简单对吧?但它的底层原理可一点都不简单,涉及到原型链的查找机制。咱们先来解剖一下它的工作原理。
原型链检测机制
instanceof
的核心逻辑是这样的:它沿着对象的原型链向上查找,看看能不能找到构造函数的prototype
属性。如果能找到就返回true
,直到原型链尽头(null
)还没找到就返回false
。
举个例子,假设我们有个数组:
const arr = []
console.log(arr instanceof Array) // true
console.log(arr instanceof Object) // 也是true
为什么arr instanceof Object
也是true
?因为数组的原型链是这样的:arr -> Array.prototype -> Object.prototype -> null
。顺着这条链能找到Object.prototype
,所以返回true
。
手写实现
理解了原理,咱们就可以动手实现一个自己的instanceof
了。老李给你写个完整版:
/**
* 自定义实现instanceof运算符
* @param {*} instance 要检测的对象
* @param {Function} constructor 构造函数
* @returns {boolean} 是否是构造函数的实例
* 全栈老李原创实现,转载请注明出处
*/
function