instanceof实现原理

144 阅读1分钟

instanceof是JavaScript的保留字,通常用于判断某个对象是否为另一个对象(构造方法)的实例,instanceof会查找原型链,直到null如果还不是后面这个对象的实例就返回false,否者就返回true。

下面是一个简单的例子

let obj = {
    name: '张三'
}
obj instanceof Object //true

因为在js中,变量都是通过构造函数创建的,这种字面量的方式其实是一种语法糖,变量obj其实是通过Object这个构造函数通过创建出来的,所以obj是构造函数Object的实例,返回会返回true。

由于实例对象的隐式原型默认等于构造函数的显示原型,所以我们可以通过查找目标对象的原型链,是否等于构造函数的原型来判断这个目标对象是否为这个构造函数的实例对象。

需要注意的是,instanceof只能判断数据类型为function和object的变量。

function instanceof_(a,b) {
    let p = a
    while(p) {
        if (p === b.prototype) {
            return true
        }
        p = p.__proto__
    }
    return false
}

let arr = [1,2,3]
let res = instanceof_(arr,Array)
console.log(res) //true

由于typeof判断array时返回的object,此时我们需要使用instanceof精准判断才能达到我们需要的结果。所以instanceof可以准确的判断复杂数据类型,但是不能正确的判断基本数据类型。

console.log( [] instanceof Array ) //true
console.log( typeof [] ) //object