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. iOS:Masonry练习详解

    Masonry练习详解   添加约束的方式: 1.通过使用NSLayoutConstraints添加约束到约束数组中,之前必须设置translatesAutoresizingMaskIntoConst ...

  2. Admin Finder

    #Created for coded32 and his teamopenfire Eliminated Some bugs from my last code shared here as Gues ...

  3. 详解Python中的生成器表达式(generator expression)

    介绍 1.生成器表达式(generator expression)也叫生成器推导式或生成器解析式,用法与列表推导式非常相似,在形式上生成器推导式使用圆括号(parentheses)作为定界符,而不是列 ...

  4. Intellij IDEA 2017 破解

    http://idea.lanyus.com/ https://www.cnblogs.com/wang1024/p/7485758.html

  5. Node.js meitulu图片批量下载爬虫1.01版

    在 http://www.cnblogs.com/xiandedanteng/p/7614051.html 一文我曾经书写过一个图片下载爬虫,但原有程序不是为下载图片而设计故有些绕,于是稍微改写了一下 ...

  6. iOS适配整理

    iOS12适配问题 1.StatusBar内部结构改变 现象:crash crash log: -[_UIStatusBarIdentifier isEqualToString:]: unrecogn ...

  7. centos 6.5 下使用nginx 反向代理 多个tornado

    centos 6.5 nginx 1.4.4 /etc/nginx/conf.d 下创建tornado.conf upstream tornado { server 127.0.0.1:8887; s ...

  8. spring--百度百科

    Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development a ...

  9. 【Java】Java_06 基本数据类型

    1.基本数据类型 Java是一种强类型语言,每个变量都必须声明其类型. .  Java的数据类型分为两大类:基本类型(primitive type)和引用类型    (reference type) ...

  10. struts2中Action訪问servlet的两种方式

    一.IoC方式                在struts2框架中,能够通过IoC方式将servlet对象注入到Action中.通常须要Action实现下面接口: a. ServletRequest ...