最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 要我自己实现 instanceof 方法?

    正文概述 掘金(Do_Better)   2021-02-21   584

    害,这多简单呀

    function myinstanceof(a,b){  
         return a instanceof b
    }
    

    集美们别打我,这我是故意的,下次还敢。


    呃呃,那它既然是通过查找原型链的方式来检测,那我们也就来实现一个 instanceof ,先了解获取原型的方法 Object.getPrototypeOf(a) 方法。

    let arr = []; 
    console.log(Object.getPrototypeOf(arr) === arr.__proto__) //true
    

    下面这段代码就是通过原型链查找的方式来实现的,第二个参数必须为构造函数。

    function myinstanceof(a, b) {
        let prototypeA = Object.getPrototypeOf(a),
            prototypeB = b.prototype;
    
        while (prototypeA) {
            if (prototypeA === prototypeB) return true;
            prototypeA = Object.getPrototypeOf(prototypeA);
        }
        return false
    }
    
    let arr = [];
    let obj = {};
    console.log(myinstanceof(Array, Object)) // true
    console.log(myinstanceof(arr, Object)) // true
    console.log(myinstanceof(arr, obj)) // false
    console.log(myinstanceof(obj, arr)) // false
    

    也没什么,就是获取到原型后,按照原型链向上查找,对比他们两的原型是否相等,一直查到 null 为止。


    更绕点的代码是下面的,并处理了传入非构造函数的情况,能看懂下面实现方式那原型链这块知识已经很扎实了。

    function myinstanceof(a,b){ 
    
        let prototypeA = typeof a == 'function' ? a.prototype : a
        let prototypeB = typeof b == 'function' ? b.prototype : b
         
        while(prototypeA != null ){  
            if(prototypeA.constructor.name === prototypeB.constructor.name) return true  
            prototypeA = prototypeA.__proto__;
        }
          
        return false
    }
    
    let arr = [];
    let obj = {}; 
    
    console.log(myinstanceof(Array,Object)) // true
    console.log(myinstanceof(arr, Object)) // true
    console.log(myinstanceof(arr, obj)) // true
    console.log(myinstanceof(obj, arr)) // false
    

    可以看到第二个参数传入非构造函数也可以被识别,这是因为上面代码经过处理,将传入的非构函数转换为函数后,在进行检测,当然,检测 b(或他的构造函数)否存在于 a 的原型链中,顺序反了也是不行的。



    起源地下载网 » 要我自己实现 instanceof 方法?

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元