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开放平台,其调用量最高的接口,必然是定位,其次就是地址解析了,又称为地理 ...
随机推荐
- solr File Upload "Unsupported ContentType: application/vnd.ms-excel Not in: [application/xml, application/csv, application/json, text/json, text/csv, text/xml, application/javabin]",
今天在用solr管理界面导入文件时报错:"Unsupported ContentType: application/vnd.ms-excel Not in: [application/xm ...
- webmagic 初始化 startRequests
在spider类中有三个方法可以初始化startRequests.可以对这些地方进行扩展. /** * create a spider with pageProcessor. * * @param p ...
- Sublime Theme
Package Control Messages======================== Theme - Spacegray----------------- Thanks for insta ...
- 小米6安装google play
http://bbs.xiaomi.cn/t-13579116 http://m.mk52.cn/jiaocheng/3288.html 步骤: 1.下载需要的文件并解压 (http://techta ...
- 单用户模式下mount -o remount,rw / 有大用途
我们的Linux系统在无法启动时候,通常需要进入单用户模式下进行修改一些配置文件,或调整一些参数方可.但是在进入单用户模式后,我们的/文件系统是只读模式,无法进行修改,那么这个时候我们就需要用到一条命 ...
- POI动态生成word2007加强版
先看效果图: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMjAzODkxNzU=/font/5a6L5L2T/fontsize/400/fill ...
- Failed to Stop or Restart Nginx Server Through Serevice Command(nginx进程不能停止重启)
Many people are accustomed to start a Nginx web server through init scripts and then they can contro ...
- android-数据库SQLite相关
android平台下的SQLite数据库是一种轻量级数据库,支持标准的SQL语句. 本文将介绍 android数据库的创建 利用sql语句对数据库增删改查 系统api数据库增删改查 数据库的事务 1, ...
- 【SSH网上商城项目实战30】项目总结(附源码下载地址)
项目基本完成了,加上这个总结,与这个项目相关的博客也写了30篇了,积少成多,写博客的过程是固化思路的一个过程,对自己很有用,同时也能帮助别人.顺便说个题外话,在学习的过程中肯定会遇到很多异常出现,我们 ...
- php 按汉字首字母查询[转载]
<?php function getfirstchar($s0){ //获取单个汉字拼音首字母.注意:此处不要纠结.汉字拼音是没有以U和V开头的 $fchar = ord($s0{0}); if ...