instanceOf-模拟实现,简单易懂

575 阅读1分钟

作用:某对象 是否为 某构造函数(类) 的实例。换言之,可以判断对象的类型。

知识储备

  •  每个函数都有prototype 属性,指向原型。
  • 每个对象都有__proto__属性,指向创建该对象的构造的原型。其实它指向的是[[prototype]],但是[[prototype]]是内部属性,我们访问不到,所以使用__proto__来访问。
  • 寻的是地址是作比较,是否执行同一片内存地址

实现步骤

1. 先取得当前构造函数(类)的原型 以及当前实例对象的原型链(proto = proto.__proto__)

2. 一直递归查找,执行原型链的查找机制

3. 如果对象的原型链 上面找到了 当前构造函数 的原型,则返回 true

4. 如果一直向上找到了对象的基类null  都未能寻到,则返回false  -> 即当: Object.__proto__.__proto__ == null

代码实现

function _instanceOf(obj,classFunc){
    let proto = obj.__proto__

    while(1){
        if(proto === null){
            return false;
        }
        
        if(proto === classFunc.prototype){
            return true
        }

        proto = proto.__proto__
    }
}

测试代码

let str = new String('1')

_instanceOf(str,String)// true