new和instanceof的内部机制

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

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

也就是说如果不对o的原型(prototype)作修改,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
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。

new和instanceof的内部机制的更多相关文章

  1. ThreadLocal内部机制及使用方法

    一.介绍ThreadLocal内部机制之前,先简单说明一下其特点及用途: 1.ThreadLocal是单线程内共享资源,多线程间无法共享(即线程A访问不了线程B中ThreadLocal存放的值): 2 ...

  2. 搭建高可用mongodb集群(三)—— 深入副本集内部机制

    在上一篇文章<搭建高可用mongodb集群(二)—— 副本集> 介绍了副本集的配置,这篇文章深入研究一下副本集的内部机制.还是带着副本集的问题来看吧! 副本集故障转移,主节点是如何选举的? ...

  3. SQL Server 内存中OLTP内部机制概述(四)

    ----------------------------我是分割线------------------------------- 本文翻译自微软白皮书<SQL Server In-Memory ...

  4. SQL Server 内存中OLTP内部机制概述(三)

    ----------------------------我是分割线------------------------------- 本文翻译自微软白皮书<SQL Server In-Memory ...

  5. SQL Server 内存中OLTP内部机制概述(二)

    ----------------------------我是分割线------------------------------- 本文翻译自微软白皮书<SQL Server In-Memory ...

  6. SQL Server 内存中OLTP内部机制概述(一)

    ----------------------------我是分割线------------------------------- 本文翻译自微软白皮书<SQL Server In-Memory ...

  7. LocalActivityManager的内部机制

    LocalActivityManager内部机制的核心在于,它使用了主线程对象mActivityThread来装载指定的Activity.注意,这里是装载,而不是启动,这点很重要. 所谓的启动,一般是 ...

  8. zookeeper 内部机制学习

    zookeeper 内部机制学习 1. zk的设计目标 最终一致性:client不论连接到那个Server,展示给它的都是同一个视图. 可靠性:具有简单.健壮.良好的性能.如果消息m被到一台服务器接收 ...

  9. Python_Mix*函数名的使用以及第一类对象,闭包,迭代器,for循环的内部机制

    一:函数名的应用(第一类对象) 函数名的命名规范和变量是一样的,函数名其实就是变量名, 0)函数名可以赋值给其他变量 def func(): #定义一个名为func的函数 print('my ange ...

随机推荐

  1. cscope的使用

    转自:http://easwy.com/blog/archives/advanced-vim-skills-cscope/ 本节所用命令的帮助入口: :help cscope 在前面的文章中介绍了利用 ...

  2. 什么时候需要使用Double? double、float、decimal的区别

    原文:什么时候需要使用Double? double.float.decimal的区别 float:浮点型,含字节数为4,32bit,数值范围为-3.4E38~3.4E38(7个有效位) double: ...

  3. java设计模式之七装饰器模式(Decorator)

    顾名思义,装饰模式就是给一个对象增加一些新的功能,而且是动态的,要求装饰对象和被装饰对象实现同一个接口,装饰对象持有被装饰对象的实例,关系图如下: Source类是被装饰类,Decorator类是一个 ...

  4. PHP文件上传后缀名与文件类型对照表

    ie 火狐 id 后缀名 php识别出的文件类型 0 gif image/gif 1 jpg image/jpeg 2 png image/png 3 bmp image/bmp 4 psd appl ...

  5. String 的intern() 方法说明

    1.说明 Java中string.intern()方法调用会先去字符串常量池中查找相应的字符串,如果字符串不存在,就会在字符串常量池中创建该字符串然后再返回. 2.源码说明 public native ...

  6. 【Android开发日记】妙用 RelativeLayout 实现3 段布局

    在设计过程中,我们经常会遇到这样的需求: 把一条线3控制,左对齐左控制,右侧控制右对齐,中间控制,以填补剩余空间. 或者一列内放3个控件,上面的与顶部对齐,以下的沉在最底部,中间控件是弹性的.充满剩余 ...

  7. Solr安装(Tomcat)

    Solr安装(Tomcat)   安装环境 Windows 7 64bit Apache-tomcat-8.0.9-windows-x64 Solr-4.9.0 JDK 1.8.0_05 64bit ...

  8. win7 64位下如何安装配置mysql-5.7.7-rc-winx64

    距离上次安装MySQL已经过去好久了.步骤这些,有可能会忘记.简单记录一下吧.(参考了一些网络上的博客.) 1.mysql-5.7.5-m15-winx64.zip下载 官方网站下载地址: http: ...

  9. Toast,AlertDialog的误解

    在一般的软件开发中,子线程中是不能更改UI主线程中创建的UI控件的.之前的理解是Toast也不能在子线程中创建.事实上并不是这样子的. @Override protected void onCreat ...

  10. 转载Mvc的多层架构

    Mvc的多层架构 分享一个Mvc的多层架构,欢迎大家拍砖斧正   多层架构是什么? 多层架构是开发人员在开发过程当中面对复杂且易变的需求采取的一种以隔离控制为主的应对策略,关于多层架构的标准,我认为有 ...