instanceof运算符可以用来判断某个构造函数的prototype属性是否存在另外一个要检测对象的原型链上。
实例一:普遍用法
A instanceof B :检测B.prototype是否存在于参数A的原型链上.
5 |
console.log(ben instanceof Ben); //true |
实例二:继承中判断实例是否属于它的父类
1 |
function Ben_parent() {} |
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 |
实例三:复杂用法
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 |
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 |
04 |
The production RelationalExpression : RelationalExpression instanceof ShiftExpression is evaluated as follows: |
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. |
14 |
15.3.5.3 [[HasInstance]] (V) |
16 |
Assume F is a Function object. |
18 |
When the [[HasInstance]] internal method of F is called with value V, the following steps are taken: |
21 |
1.If V is not an object, return false. |
23 |
//用 [[Get]] 方法取 F方法的prototype属性,结果赋值给O |
24 |
2.Let O be the result of calling the [[Get]] internal method of F with property name "prototype". |
27 |
3.If Type(O) is not Object, throw a TypeError exception. |
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. |
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的隐式原型 |
05 |
//Object.prototype.__proto__ === null |
08 |
if (O === A) // 这里重点:当 O 严格等于 A 时,返回 true |
使用此函数模拟解析过程:
01 |
Object instanceof Object解析,执行_instanceof (Object, Object) |
03 |
A = Object.__proto__ = Function.prototype |
04 |
A = Function.prototype.__proto__ = Object.prototype |
07 |
Function instanceof Function解析,执行_instanceof (Function, Function) |
08 |
O = Function.prototype; |
09 |
A = Function.__proto__ = Function.prototype; |
12 |
Function instanceof Object解析,执行_instanceof (Function, Object) |
14 |
A = Function.__proto__ = Function.prototype; |
15 |
A = Function.prototype.__proto__ = Object.prototype; |
18 |
String instanceof String解析,执行_instanceof (String, String) |
20 |
A = String.__proto__ = Function.prototype; |
21 |
A = Function.prototype.__proto__ = Object.prototype; |
22 |
A = Object.prototype.__proto__ = null ; |
25 |
Ben instanceof Ben解析,执行_instanceof (Ben, Ben) |
27 |
A = Ben.__proto__ = Ben.prototype; |
28 |
A = Ben.prototype.__proto__ = Object.prototype; |
29 |
A = Object.prototype.__proto__ = null ; |
参考链接:
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
http://www.zuojj.com/archives/393.html
- JS面向对象(1) -- 简介,入门,系统常用类,自定义类,constructor,typeof,instanceof,对象在内存中的表现形式
相关链接: JS面向对象(1) -- 简介,入门,系统常用类,自定义类,constructor,typeof,instanceof,对象在内存中的表现形式 JS面向对象(2) -- this的使用,对 ...
- JS面向对象(3) -- Object类,静态属性,闭包,私有属性, call和apply的使用,继承的三种实现方法
相关链接: JS面向对象(1) -- 简介,入门,系统常用类,自定义类,constructor,typeof,instanceof,对象在内存中的表现形式 JS面向对象(2) -- this的使用,对 ...
- JS面向对象(2) -- this的使用,对象之间的赋值,for...in语句,delete使用,成员方法,json对象的使用,prototype的使用,原型继承与原型链
相关链接: JS面向对象(1) -- 简介,入门,系统常用类,自定义类,constructor,typeof,instanceof,对象在内存中的表现形式 JS面向对象(2) -- this的使用,对 ...
- node.js学习(二)--Node.js控制台(REPL)&&Node.js的基础和语法
1.1.2 Node.js控制台(REPL) Node.js也有自己的虚拟的运行环境:REPL. 我们可以使用它来执行任何的Node.js或者javascript代码.还可以引入模块和使用文件系统. ...
- JS 学习(四)对象
对象 在JS中,对象是数据(变量),拥有属性和方法. JS中所有事物都是对象:字符串.数字.数组.日期等. 对象是拥有属性和方法的特殊数据类型. 属性是与对象相关的值. 方法是能够在对象上执行的动作. ...
- node.js学习(1)
新建便笺 3 node.js学习(1) 1)安装 http://nodejs.org/download/下载. 2)编写一个案例 var http=require("http"); ...
- 微信公众平台Js API(WeixinApi)
微信公众平台Js API(WeixinApi): https://github.com/zxlie/WeixinApi#user-content-3%E9%9A%90%E8%97%8F%E5%BA%9 ...
- 【高德地图API】从零开始学高德JS API(七)——定位方式大揭秘
原文:[高德地图API]从零开始学高德JS API(七)——定位方式大揭秘 摘要:关于定位,分为GPS定位和网络定位2种.GPS定位,精度较高,可达到10米,但室内不可用,且超级费电.网络定位,分为w ...
- 【高德地图API】从零开始学高德JS API(八)——地址解析与逆地址解析
原文:[高德地图API]从零开始学高德JS API(八)——地址解析与逆地址解析 摘要:无论是百度LBS开放平台,还是高德LBS开放平台,其调用量最高的接口,必然是定位,其次就是地址解析了,又称为地理 ...
随机推荐
- linux下GPRS模块的应用程序
---------------------------------------------------------------------------------------------------- ...
- Shell实现循环执行curl向Solr导入json文件
#!/bin/bash for file in ./文件夹名/* do echo $file curl "http://IP:8983/solr/集合名/update?commit=true ...
- $HTTP_RAW_POST_DATA 与$_POST
出处:http://blog.163.com/gwo-cce@126/blog/static/325736492008101142422345/ 这是手册里写的 总是产生变量包含有原始的 POST 数 ...
- ionic关于隐藏底部tabs终极解决方案
网上看到很多都是写个指令,监听view进出对tab进行显示隐藏,试过挺多个,自己写了一个,都不是太让人满意,问题大多数为: 1.二级页面是隐藏了tab,但是进去三级视图发现tab又出来了 2.三级,四 ...
- bzoj1710【Usaco2007 Open】Cheappal 便宜回文
1710: [Usaco2007 Open]Cheappal 便宜回文 Time Limit: 5 Sec Memory Limit: 64 MB Submit: 466 Solved: 262 ...
- 利用Json_encode解决中文问题
利用Json_encode解决中文问题 public function return_json($data=array()){ echo json_encode($data ...
- 【BIEE】15_时间维度建立
时间维度的建立 1.环境准备 ①新建时间维度表:TIME_DIMENSION 建立时间维度表并插入数据 ---------------创建时间维度表 create table TIME_DIMENSI ...
- ZOJ 3827 Information Entropy (2014牡丹江区域赛)
题目链接:ZOJ 3827 Information Entropy 依据题目的公式算吧,那个极限是0 AC代码: #include <stdio.h> #include <strin ...
- Spring 常用类
一.拦截器 public class SysInteceptor implements HandlerInterceptor { /** * 最后执行,可用于释放资源 */ @Override pub ...
- Linux 查看CPU个数和磁盘个数
top后按数字1,多个cpu的话会显示多个 fdisk -l可以看到多个物理硬盘,做了硬raid只能看到一个硬盘 cat /proc/cpuinfo查看cpu具体的信息