zoukankan      html  css  js  c++  java
  • new和instanceof的内部机制

    首先我们来看看var obj = new O()这条语句发生了什么:

    var obj = (function(){
        var obj = {};
        obj.__proto__ = O.prototype;
    
        //其他赋值语句...
    
        return obj;
    })();

    也就是说var obj = new O()返回了一个obj对象,它的隐式原型链(__proto__)是指向O原型(prototype)的。这就是new的内部工作方式。

    下面再看instanceof,假设现在有 x instanceof y 一条语句,则其内部实际作出了如下的判断:

    while(x.__proto__!==null) {
      if(x.__proto__===y.prototype) {
        return true;
        break;
      }
      x.__proto__
    = x.__proto__.proto__; }
    if(x.__proto__==null) {return false;}

    x会一直沿着隐式原型链__proto__向上查找直到x.__proto__.__proto__......===y.prototype为止,如果找到则返回true,也就是x为y的一个实例。否则返回false,x不是y的实例。

    下面举出两个例子,把对O的原型(prototype)的修改放在obj的声明之前和之后的两种情况下,使用instanceof对obj作检测的结果对比:

     1 function F(){}
     2 function O(){}
     3 
     4 O.prototype = new F();
     5 var obj = new O();
     6 /*
        以上两条语句等同于如下代码
        var obj = (function(){
          var obj1 = {};
          var obj2 = {};
          obj2.__proto__ = F.prototype;
          obj.__proto__ = obj2;
          return obj;
        })()
      */ 7 console.log(obj instanceof O);//true 8 console.log(obj instanceof F);//true 9 console.log(obj.__proto__===O.prototype);//true 10 console.log(obj.__proto__.__proto__===F.prototype);//true

    上面这个例子中obj.__proto__和o.prototype都是指向new F()这个对象的,所以obj instanceof o结果为true;

    假设上面new F()这个对象为objF,则根据new的内部机制,objF.__proto__===F.prototype,而objF.__proto__等于obj.__proto__.__proto__。

    所以obj instanceof F结果也是true。

     1 function F(){}
     2 function O(){}
     3 
     4 var obj = new O();
     5 o.prototype = new F();
     6 
     7 console.log(obj instanceof O);//false
     8 console.log(obj instanceof F);//false
     9 console.log(obj.__proto__===O.prototype);//false
    10 console.log(obj.__proto__.__proto__===F.prototype);//false

    也假设上面new F()这个对象为objF。

    这个例子中obj.prototype的修改在obj的声明之后,也就是说obj.__proto__是指向o最初始的prototype,自然地obj.__proto__也与objF不相等。所以obj instanceof O结果为false。

    最后,obj instance F为false也很好理解,这是因为obj.__proto__.__proto__指向的是Object.prototype。

  • 相关阅读:
    简易httpserver 和客户端调用
    exe打包简易教程
    图像二值化和显示3D 的算法实现
    gitlab 生成标签
    Nginx 使用小结
    FFMPEG 切片过于占用cpu的问题
    神奇 linux 命令行 窗体穿越
    使用 SSH 在 Linux 上远程调试 .NET Core 实例 演示
    CentOS 7 yum 安装 Nginx 以及 TCP流转发
    Centos7 自动挂载分区硬盘 u盘的操作
  • 原文地址:https://www.cnblogs.com/WhiteCusp/p/3171705.html
Copyright © 2011-2022 走看看