instanceof操作解析

instanceof 的原理是什么呢?

根据 ECMAScript 语言规范,整理了一段代码如下

    function new_instance_of(leftVaule, rightVaule) { 
        let rightProto = rightVaule.prototype; // 取右表达式的 prototype 值
        leftVaule = leftVaule.__proto__; // 取左表达式的__proto__值
        while (true) {
        if (leftVaule === null) {
                return false;  
            }
            if (leftVaule === rightProto) {
                return true;  
            } 
            leftVaule = leftVaule.__proto__ 
        }
    }

其实 instanceof 主要的实现原理就是只要右边变量的 prototype 在左边变量的原型链上即可。因此,instanceof 在查找的过程中会遍历左边变量的原型链,直到找到右边变量的 prototype,如果查找失败,则会返回 false,告诉我们左边变量并非是右边变量的实例。

特殊例子

    Object instanceof Object   // true
    Object instanceof Function    //true
    Function instanceof Object    //true
    Function instanceof Function    //true
    Array instanceof Function    //true
    Array instanceof Object    //true

解释

首先Object是一个构造函数,既然是构造函数那在语言内部就是通过Function这个构造函数new出来的,那么Object的proto自然就指向Function的prototype

    Object.__proto__ === Function.prototype    // true

我们打印一下Function.prototype看看

    ƒ () { [native code] }

    // typeof Function.prototype === 'function'

这里看起来是一个函数,其实我也不是很清楚为什么这个函数的proto就指向Object.prototype了

    Function.prototype.__proto__ === Object.prototype

虽然有点疑问,但是就可以解释上面的这些关系了,因为Function自身绕成了一个圈

    Function.__proto__ === Function.prototype    // true
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • JS中原型链,说简单也简单。 首先明确: 函数(Function)才有prototype属性,对象(除Object...
    前小白阅读 3,962评论 0 9
  • 第一章 错误处理: 错误: 程序运行过程中,导致程序无法正常执行的现象(即bug) 现象: 程序一旦出错,默认会报...
    fastwe阅读 1,151评论 0 1
  • 2018-6-28复习每一次回头看基础,都有新的理解 Function.prototype.call 函数实例的c...
    woow_wu7阅读 450评论 0 0
  • 第3章 基本概念 3.1 语法 3.2 关键字和保留字 3.3 变量 3.4 数据类型 5种简单数据类型:Unde...
    RickCole阅读 5,162评论 0 21
  • 戒,是克己的意思,克制且修缮自己。人不为己天诛地灭,讲的是人不修缮自己的不足,会被诛灭。
    polly3600阅读 173评论 0 0