美文网首页
instanceof 的深度剖析

instanceof 的深度剖析

作者: _花 | 来源:发表于2018-10-25 11:15 被阅读0次

    JavaScript instanceof 运算符代码

    function instance_of(L, R) {//L 表示左表达式,R 表示右表达式
     var O = R.prototype;// 取 R 的显示原型
     L = L.__proto__;// 取 L 的隐式原型
     while (true) { 
       if (L === null) 
         return false; 
       if (O === L)// 这里重点:当 O 严格等于 L 时,返回 true 
         return true; 
       L = L.__proto__; 
     } 
    }
    

    原型链图片(唯有读懂此图才可以明白下面的三个判断)


    原型链.png

    Object instanceof Object

    // 为了方便表述,首先区分左侧表达式和右侧表达式
    ObjectL = Object, ObjectR = Object;
    // 下面根据规范逐步推演
    O = ObjectR.prototype = Object.prototype
    L = ObjectL.proto = Function.prototype
    // 第一次判断
    O != L
    // 循环查找 L 是否还有 proto
    L = Function.prototype.proto = Object.prototype
    // 第二次判断
    O == L
    // 返回 true

    Function instanceof Function

    // 为了方便表述,首先区分左侧表达式和右侧表达式
    FunctionL = Function, FunctionR = Function;
    // 下面根据规范逐步推演
    O = FunctionR.prototype = Function.prototype
    L = FunctionL.proto = Function.prototype
    // 第一次判断
    O == L
    // 返回 true

    Foo instanceof Foo

    // 为了方便表述,首先区分左侧表达式和右侧表达式
    FooL = Foo, FooR = Foo;
    // 下面根据规范逐步推演
    O = FooR.prototype = Foo.prototype
    L = FooL.proto = Function.prototype
    // 第一次判断
    O != L
    // 循环再次查找 L 是否还有 proto
    L = Function.prototype.proto = Object.prototype
    // 第二次判断
    O != L
    // 再次循环查找 L 是否还有 proto
    L = Object.prototype.proto = null
    // 第三次判断
    L == null
    // 返回 false
    详情参看:https://www.ibm.com/developerworks/cn/web/1306_jiangjj_jsinstanceof/

    相关文章

      网友评论

          本文标题:instanceof 的深度剖析

          本文链接:https://www.haomeiwen.com/subject/ereqtqtx.html