instanceof运算符可以用来判断某个构造函数的prototype属性是否存在另外一个要检测对象的原型链上。
实例一:普遍用法

A instanceof B :检测B.prototype是否存在于参数A的原型链上.

1 function Ben() {
2  
3 }
4 var ben = new Ben();
5 console.log(ben instanceof Ben);//true

 实例二:继承中判断实例是否属于它的父类

1 function Ben_parent() {}
2 function Ben_son() {}
3 Ben_son.prototype = new Ben_parent();//原型继承
4 var ben_son = new Ben_son();
5 console.log(ben_son instanceof Ben_son);//true
6 console.log(ben_son instanceof Ben_parent);//true

 实例三:复杂用法

1 function Ben() {}
2 console.log(Object instanceof Object);     //true
3 console.log(Function instanceof Function); //true
4 console.log(Function instanceof Object);   //true
5 console.log(Ben instanceof Function);      //true
6  
7 console.log(String instanceof String);   //false
8 console.log(Boolean instanceof Boolean); //false
9 console.log(Ben instanceof Ben);         //false

看到上述的结果,是否有点懵了,究其原因,还需探其原理,下面我们来看看规范中如何定义的。

01 ECMASCRIPT 5.1 Standard文档中的定义:
02 11.8.6 The instanceof operator
03  
04 The production RelationalExpression : RelationalExpression instanceof ShiftExpression is evaluated as follows:
05  
06 1.Let lref be the result of evaluating RelationalExpression.
07 2.Let lval be GetValue(lref).
08 3.Let rref be the result of evaluating ShiftExpression.
09 4.Let rval be GetValue(rref).
10 5.If Type(rval) is not Object, throw a TypeError exception.
11 6.If rval does not have a [[HasInstance]] internal method, throw a TypeError exception.
12 7.Return the result of calling the [[HasInstance]] internal method of rval with argument lval.
13  
14 15.3.5.3 [[HasInstance]] (V)
15  
16 Assume F is a Function object.
17  
18 When the [[HasInstance]] internal method of F is called with value V, the following steps are taken:
19  
20 //V不是对象,直接返回false
21 1.If V is not an object, return false.
22  
23 //用 [[Get]] 方法取 F方法的prototype属性,结果赋值给O
24 2.Let O be the result of calling the [[Get]] internal method of F with property name "prototype".
25  
26 //如果O不是一个对象,报告异常
27 3.If Type(O) is not Object, throw a TypeError exception.
28  
29 //重复循环
30 4.Repeat
31     //V = V.[[Prototype]]
32     a.Let V be the value of the [[Prototype]] internal property of V.
33     b.If V is null, return false.
34     c.If O and V refer to the same object, return true.
35  
36 NOTE Function objects created using Function.prototype.bind have a different implementation of [[HasInstance]] defined in 15.3.4.5.3.

对应上述规范做个函数模拟A instanceof B:

01 function _instanceof(A, B) {
02     var O = B.prototype;// 取B的显示原型
03     A = A.__proto__;// 取A的隐式原型
04     while (true) { 
05         //Object.prototype.__proto__ === null
06         if (A === null) 
07             return false; 
08         if (O === A)// 这里重点:当 O 严格等于 A 时,返回 true 
09             return true; 
10         A = A.__proto__;
11     }
12 }

使用此函数模拟解析过程:

01 Object instanceof Object解析,执行_instanceof (Object, Object)
02 O = Object.prototype;
03 A = Object.__proto__ = Function.prototype
04 A = Function.prototype.__proto__ = Object.prototype
05 return true;
06  
07 Function instanceof Function解析,执行_instanceof (Function, Function)
08 O = Function.prototype;
09 A = Function.__proto__ = Function.prototype;
10 return true;
11  
12 Function instanceof Object解析,执行_instanceof (Function, Object)
13 O = Object.prototype;
14 A = Function.__proto__ = Function.prototype;
15 A = Function.prototype.__proto__ = Object.prototype;
16 return true;
17  
18 String instanceof String解析,执行_instanceof (String, String)
19 O = String.prototype;
20 A = String.__proto__ = Function.prototype;
21 A = Function.prototype.__proto__ = Object.prototype;
22 A = Object.prototype.__proto__ = null;
23 return false;
24  
25 Ben instanceof Ben解析,执行_instanceof (Ben, Ben)
26 O = Ben.prototype;
27 A = Ben.__proto__ = Ben.prototype;
28 A = Ben.prototype.__proto__ = Object.prototype;
29 A = Object.prototype.__proto__ = null;
30 return false;

 参考链接:

http://www.zuojj.com/tdocs/es5.1/#sec-11.8.6

http://blog.csdn.net/cuew1987/article/details/15498121

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/instanceof

转载声明:

本文标题:深入javascript(六):instanceof 运算符

本文链接:http://www.zuojj.com/archives/393.html,转载请注明转自Benjamin-专注前端开发和用户体验

 
http://www.zuojj.com/archives/393.html

js instanceof (2)的更多相关文章

  1. JS面向对象(1) -- 简介,入门,系统常用类,自定义类,constructor,typeof,instanceof,对象在内存中的表现形式

    相关链接: JS面向对象(1) -- 简介,入门,系统常用类,自定义类,constructor,typeof,instanceof,对象在内存中的表现形式 JS面向对象(2) -- this的使用,对 ...

  2. JS面向对象(3) -- Object类,静态属性,闭包,私有属性, call和apply的使用,继承的三种实现方法

    相关链接: JS面向对象(1) -- 简介,入门,系统常用类,自定义类,constructor,typeof,instanceof,对象在内存中的表现形式 JS面向对象(2) -- this的使用,对 ...

  3. JS面向对象(2) -- this的使用,对象之间的赋值,for...in语句,delete使用,成员方法,json对象的使用,prototype的使用,原型继承与原型链

    相关链接: JS面向对象(1) -- 简介,入门,系统常用类,自定义类,constructor,typeof,instanceof,对象在内存中的表现形式 JS面向对象(2) -- this的使用,对 ...

  4. node.js学习(二)--Node.js控制台(REPL)&&Node.js的基础和语法

    1.1.2 Node.js控制台(REPL) Node.js也有自己的虚拟的运行环境:REPL. 我们可以使用它来执行任何的Node.js或者javascript代码.还可以引入模块和使用文件系统. ...

  5. JS 学习(四)对象

    对象 在JS中,对象是数据(变量),拥有属性和方法. JS中所有事物都是对象:字符串.数字.数组.日期等. 对象是拥有属性和方法的特殊数据类型. 属性是与对象相关的值. 方法是能够在对象上执行的动作. ...

  6. node.js学习(1)

    新建便笺 3 node.js学习(1) 1)安装 http://nodejs.org/download/下载. 2)编写一个案例 var http=require("http"); ...

  7. 微信公众平台Js API(WeixinApi)

    微信公众平台Js API(WeixinApi): https://github.com/zxlie/WeixinApi#user-content-3%E9%9A%90%E8%97%8F%E5%BA%9 ...

  8. 【高德地图API】从零开始学高德JS API(七)——定位方式大揭秘

    原文:[高德地图API]从零开始学高德JS API(七)——定位方式大揭秘 摘要:关于定位,分为GPS定位和网络定位2种.GPS定位,精度较高,可达到10米,但室内不可用,且超级费电.网络定位,分为w ...

  9. 【高德地图API】从零开始学高德JS API(八)——地址解析与逆地址解析

    原文:[高德地图API]从零开始学高德JS API(八)——地址解析与逆地址解析 摘要:无论是百度LBS开放平台,还是高德LBS开放平台,其调用量最高的接口,必然是定位,其次就是地址解析了,又称为地理 ...

随机推荐

  1. Coherence的集群成员的离开和加入机制研究

    最近在客户那里环境中coherence集群不稳定,所以找出一些文档,需要搞清楚Coherence内部的一些机制 1.集群成员的离开 关于状态的检测,官方的说法是: Death detection is ...

  2. Oracle API Gateway连接WebService服务,攻击保护

    1.启动和连接OAG OAG连接的时候除了不选择analysis,其他都选上,然后启动Gateway实例以及Nodemanager. 命令如下: /$OAG_HOME/apigateway/posix ...

  3. Linux中C语言的编程

    编译的过程 编译的概念:编译程序读取源程序(字符流),对之进行词法与语法的分析,将高级语言指令转换成功能等效的汇编代码,再由汇编程序转换成机器语言,并且按照操作系统对可执行文件格式的要求链接成可执行程 ...

  4. iTOP-4412 开发板的 GPIO 是怎么操作的?

    Exynos4412 全部的 GPIO 都有固定的地址,为了方便操作这些 GPIO.Linux 内核 在 gpio-exynos4.h 里面定义了一些 GPIO 的宏.比如: #define EXYN ...

  5. Java中的值传递与“引用传递”

    首先,Java没有 引用传递 这么一说. Java仅仅有值传递.传递的都是值,基本数据类型传递的是值.引用类型传递的是地址值. 我来理一下这当中宛如米线跟米面绞在一起了,再跟粉丝混在一起的关系. 好的 ...

  6. java 入门-helloWorld

    Java 教程 Java 是由Sun Microsystems公司于1995年5月推出的高级程序设计语言. Java可运行于多个平台,如Windows, Mac OS,及其他多种UNIX版本的系统. ...

  7. 用聚合数据API(苏州实时公交API)快速写出小程序

    利用聚合数据API快速写出小程序,过程简单. 1.申请小程序账号 2.进入开发 3.调用API.比如“苏州实时公交”小程序,选择的是苏州实时公交API. 苏州实时公交API文档:https://www ...

  8. [Liferay] Liferay 实现单点登录 - OpenLDAP

    Liferay 的单点登录绝对是个难啃的骨头,更何况网上能搜到的基本都是些滥竽充数的文章,很不负责任. 于是在自己搭通单点登录一条线之后,决定整理下思路并写出来,希望各位能别重蹈覆辙. 本文不介绍概念 ...

  9. Android五大布局标签和属性总结

    1.LinearLayout orention  水平和垂直 weight     切割闲置空间 水平布局 切割宽度 垂直布局 切割的高度 切割的时候 指定的高度或者宽度不能用fill_parent/ ...

  10. sql中update,alter,modify,delete,drop的区别和使用(整理)

    关于update和alter: 百度知道上关于update和alter有一个很形象的总结: 一个表有很多字段,一个字段里有很多数据. 一个家有很多房间,一个房间里有很多家具. update是用来将衣柜 ...