• instanceof实现原理


    在这里插入图片描述

    最简单实现

    function instanceof(left, right) {
        let leftValue = left.__proto__;
        while (true) {
            if (leftValue === null) return false;
            if (leftValue === right.prototype) return true;
            leftValue = leftValue.__proto__;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    全面实现

    function instanceOf(left, right) {
     if (typeof right !== "function")
       throw new TypeError(
         "Uncaught TypeError: Right-hand side of " instanceof
           " is not an object"
       );
     if (obj === null || !/^(object|function)$/i.test(typeof left))
       return false;
     if (!right.prototype)
       throw new TypeError(
         "TypeError: Function has non-object prototype 'undefined' in instanceof check"
       );
    
     let hasInstance =
       typeof Symbol !== "undefined" && right[Symbol.hasInstance];
     if (hasInstance) {
       return hasInstance.call(right, left);
       /* right[Symbol.hasInstance](left) */
     }
     let proto = Object.getPrototypeOf(obj);
     while (proto) {
       if (proto === right.prototype) return true;
       proto = Object.getPrototypeOf(proto);
     }
     return false;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    为啥用instanceof

    1. typeof null -> ‘object’
    2. typeof 不能细分对象 除了函数外
    3. 所有数据类型值 在计算机底层都是64位 2进制来存储的 所有的对象数据类型值,前三位
    4. 都是0,而null存储的二进制全是0
    5. typeof 就是按照二进制值来进行检测的 性能好,例如 他认为前三位是0 都是对象,在这基础
    6. 上再看对象有没有实现call 实现call了 结果是funciton 没有实现 结果就是‘object’,
    7. 所以 typeof null结果就是 ‘object’ 也不能细分对象
    8. typeof 检测一个未被声明的变量 不会报错 结果是 undefined 排除这个变量在后面会被let/const声明
    9. left instanceof right 先检测 right是否有Symbol.hasInstance 这个属性方法,如果存在,则基于
    10. 这个方法进行检测 rightSymbol.hasInstance
    11. 如果没有这个属性方法,获取value的原型链,直到找到Object.prototype,如果right.prototype出现在
    12. 他的原型链上,则证明value是right的实例,反之则不是
    13. 在新版本浏览器中 在Function.prototype上存在一个属性方法 Symbol.hasInstance,所以只要是函数
    14. 无论是普通函数还是构造函数 都具备Symbol.hasInstance这个方法
  • 相关阅读:
    Linux|软件安装包deb打包
    【玩转CSS】学成在线(文末素材源码自取)
    若依前端,菜单栏切换时刷新问题[页面菜单切换时,页面总是重新刷新,导致页面输入的查询参数重载清空]...
    Scala的高级用法
    设计海报,这7个工具网站就够了!
    基于Android的仿美团外卖系统设计与实现 文档+源码+视频
    uniapp 轮播列表左右滑动,滑动到中间放大
    [极客大挑战 2019]Http1
    GNU调试、反编译、二进制分析工具链
    磁环选型攻略及EMC整改技巧
  • 原文地址:https://blog.csdn.net/formylovetm/article/details/126546138