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. 瘸腿蛤蟆笔记29-cocos2d-x-3.2 Box2d物理引擎dynamics模块介绍

    转载标明出处:http://blog.csdn.net/notbaron/article/details/38611335 上篇回想 本篇名言:奋斗.寻觅.发现,而不屈服.[诗人丁尼生] 上篇中,我们 ...

  2. UIButton UIImage 用法分析

    一.UIButton和UIImageView的区别 1.显示图片 1> UIImageView只能显示一种图片(图片默认会填充整个UIImageView) image\setImage: 2&g ...

  3. 使用JavaScriptSerializer进行序列化日期类型应该注意的问题

    原文:使用JavaScriptSerializer进行序列化日期类型应该注意的问题 JavaScriptSerializer在序列化DateTime时,是用刻度来表示的,具体在Json体现为:\/Da ...

  4. Linux页快速缓存与回写机制分析

    參考 <Linux内核设计与实现> ******************************************* 页快速缓存是linux内核实现的一种主要磁盘缓存,它主要用来降低 ...

  5. installshield制作的安装包卸载时提示重启动的原因以及解决办法

    原文:installshield制作的安装包卸载时提示重启动的原因以及解决办法 有时候卸载installshield制作的安装包程序,卸载完会提示是否重启电脑以完成所有卸载,产生这个提示的常见原因有如 ...

  6. Python 2.7.3 Time与DateTime格式化

    import time import datetime class TimeX: '''时间工具,目前用于格式化时间''' @staticmethod def GetLocalTimeString_T ...

  7. .net使用cefsharp开源库开发chrome

    .net使用cefsharp开源库开发chrome 离上篇写介绍pc端的混合开发和为什么以cefsharp入手研究混合开发已经有好几天,一直忙,抽不出时间继续写怎么搭建cefsharp开发环境.其实没 ...

  8. MySQL之GROUP BY用法误解

    1.说明  “Group By”从字面意义上理解就是根据“By”指定的规则对数据进行分组,所谓的分组就是将一个“数据集”划分成若干个“小区域”,然后针对若干个“小区域”进行数据处理.(只是简单说明这个 ...

  9. 用erlang写的kmp算法

    Knuth-Morris-Pratt 字符串查找算法,简称为 "KMP算法",常用于在一个文本串S内查找一个模式串P 的出现位置,这个算法由Donald Knuth.Vaughan ...

  10. 在ubuntu纯字符gdb界面下来开发调试嵌入式ARM

    前面一个帖子介绍了使用eclipse来开发STM32的固件,但有的时候使用Eclipse的GDB调试器会崩溃掉,反复这样造成我们开发的效率降低,信心也会受一打击. 最近接触到的许多源码,就是在linu ...