JavaScript instanceof 运算符深入剖析
2018-01-16 16:52
260 查看
instanceof 运算符简介
在 JavaScript 中,判断一个变量的类型尝尝会用 typeof 运算符,在使用 typeof 运算符时采用引用类型存储值会出现一个问题,无论引用的是什么类型的对象,它都返回 "object"。ECMAScript 引入了另一个 Java 运算符 instanceof 来解决这个问题。instanceof 运算符与 typeof 运算符相似,用于识别正在处理的对象的类型。与 typeof 方法不同的是,instanceof 方法要求开发者明确地确认对象为某特定类型。例如:清单 1. instanceof 示例
instanceof 运算符的常规用法
通常来讲,使用 instanceof 就是判断一个实例是否属于某种类型。例如:清单 2. instanceof 常规用法
清单 3. instanceof 在继承中关系中的用法
你真的了解 instanceof 操作符吗?
看了上面的代码示例,是不是觉得 instanceof 操作符很简单,下面来看点复杂的用法。清单 4. instanceof 复杂用法
详细剖析 ECMAScript-262 edition 3 中 instanceof 运算符的定义
语言规范对中 instanceof 运算符的定义如下:清单 5. 规范中 instanceof 运算符定义
清单 6. JavaScript instanceof 运算符代码
JavaScript 原型继承机制
由于本文主要集中在剖析 JavaScript instanceof 运算符,所以对于 JavaScript 的原型继承机制不再做详细的讲解,下面参考来自 http://www.mollypages.org/misc/js.mp 的一张图片,此图片详细的描述了 JavaScript 各种对象的显示和隐式原型链结构。由其本文涉及显示原型和隐式原型,所以下面对这两个概念作一下简单说明。在 JavaScript 原型继承结构里面,规范中用 [[Prototype]] 表示对象隐式的原型,在 JavaScript 中用 __proto__ 表示,并且在 Firefox 和 Chrome 浏览器中是可以访问得到这个属性的,但是 IE 下不行。所有 JavaScript 对象都有 __proto__ 属性,但只有 Object.prototype.__proto__ 为 null,前提是没有在 Firefox 或者 Chrome
下修改过这个属性。这个属性指向它的原型对象。 至于显示的原型,在 JavaScript 里用 prototype 属性表示,这个是 JavaScript 原型继承的基础知识,在这里就不在叙述了。
图 1. JavaScript 原型链
讲解 instanceof 复杂用法
有了上面 instanceof 运算符的 JavaScript 代码和原型继承图,再来理解 instanceof 运算符将易如反掌。下面将详细讲解 Object instanceof Object,Function instanceof Function 和 Foo instanceof Foo 三个示例,其它示例读者可自行推演。清单 7. Object instanceof Object
清单 8. Function instanceof Function
清单 9. Foo instanceof Foo
简析 instanceof 在 Dojo 继承机制中的应用
在 JavaScript 中,是没有多重继承这个概念的,就像 Java 一样。但在 Dojo 中使用 declare 声明类时,是允许继承自多个类的。下面以 Dojo 1.6.1 为例。清单 10. Dojo 中多重继承
结束语
本文详细介绍了 JavaScript 语言中 instanceof 运算符,并且结合语言规范深入剖析了此操作符的算法。对读者使用 JavaScript 编写复杂的面向对象程序会有很大的帮助。本文所有代码在 Firefox 15 下通过测试。2017
年 03 月 03 日
definer
你好,我在验证var a = "1", a instanceof String的时候发现不符合上文所说的情况,a.__proto__ === String.prototype//true
2017
年 05 月 25 日
thinkershare
String是一个构造函数对象,a的类型不是String,而是string,整个类型无法直接检测,a.__proto__会导致a被临时包装为一个object类型的对象,此时这个临时对象是由String构造函数创建的,所以a.__proto__===String.prototype成立,重要的是要理解JavaScript中只有这几个类型:number/boolean/string/undefined/null/object,并没有什么乱七八糟的Object/Function/Array,它们都只不过是一堆object!编辑
2017 年 05 月 25 日
相关文章推荐
- JavaScript instanceof 运算符深入剖析
- JavaScript instanceof 运算符深入剖析
- JavaScript instanceof 运算符深入剖析【转载】
- JavaScript instanceof 运算符深入剖析
- JavaScript instanceof 运算符深入剖析
- JavaScript instanceof 运算符深入剖析
- JavaScript instanceof 运算符深入剖析
- JavaScript instanceof 运算符深入剖析
- JavaScript instanceof 运算符深入剖析
- JavaScript instanceof 运算符深入剖析
- JavaScript instanceof 运算符深入剖析
- JavaScript instanceof 运算符深入剖析
- js基础2-深入理解javascript之typeof和instanceof
- 深入剖析 redis AOF 持久化策略
- Javascript TypeOf InstanceOf
- 深入剖析JavaScript中的枚举功能
- javaScript 工作必知(六) delete in instanceof
- 深入剖析 JavaScript 的深复制
- JavaScript对象系统深入剖析-4.Scope和Closure(闭包)