zoukankan      html  css  js  c++  java
  • 561 手写instanceof

    // example:要检测的实例 
    // classFunc:要检测的类
    function instance_of(example, classFunc) {
      // TZH: 判断是否是基本类型要反向判断,即判断是否object(null特殊处理)和function。
      // 因为纵观es发展历史,基本类型还可能会继续增加,但是引用类型应该会一直只有刚才说那两个,因为es进化时会考虑网络兼容性。
      // 判断是否function、object可以保证随着es进化继续向后兼容。
      // 下面2行是我增加的代码
      if (example === null) return false
      if (!/^object|function$/.test(typeof example)) return false
    
      // 找当前实例的原型,相当于example.__proto
      let proto = Object.getPrototypeOf(example);
      let classPrototype = classFunc.prototype;
      while (true) {
        // 到了Object.prototype.__proto__
        if (proto === null) return false;
        // 在当前实例的原型链上找到了当前类
        if (proto === classPrototype) return true;
        // 继续找上一级的原型 【不是找classPrototype的上一级原型链。】
        proto = Object.getPrototypeOf(proto);
      }
    }
    
    // Function.prototype : Symbol.hasInstance
    console.log([] instanceof Array);
    // 浏览器内部其实是基于Symbol.hasInstance检测的
    console.log(Array[Symbol.hasInstance]([]));
    
    let res = instance_of([12, 23], Array);
    console.log(res); // true
    
    let res2 = instance_of({}, Object)
    console.log(res2) // true
    
    let res3 = instance_of(function () { }, Object)
    console.log(res3) // true
    
    let res4 = instance_of({}, Array)
    console.log(res4) // false
    
    let res5 = instance_of(function () { }, Array)
    console.log(res5) // false
    
    let res6 = instance_of(11, Number)
    console.log(res6) // false
    
  • 相关阅读:
    分享下有趣的注释头
    android studio 的自动更新问题
    docker 搭建kafka集群(入门版)
    brew换源
    golang web框架 kratos中的日志框架
    golang 日志框架(zap)完整配置和使用
    python 日志模块
    mysqldump备份恢复数据
    寻找二叉树上从根结点到给定结点的路径
    linux 磁盘IO速度测试
  • 原文地址:https://www.cnblogs.com/jianjie/p/13867628.html
Copyright © 2011-2022 走看看