亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > JS > 正文

深入剖析JavaScript instanceof 運算符

2024-05-06 16:52:10
字體:
來源:轉載
供稿:網友

instanceof 運算符簡介

在 JavaScript 中,判斷一個變量的類型嘗嘗會用 typeof 運算符,在使用 typeof 運算符時采用引用類型存儲值會出現一個問題,無論引用的是什么類型的對象,它都返回 "object"。ECMAScript 引入了另一個 Java 運算符 instanceof 來解決這個問題。instanceof 運算符與 typeof 運算符相似,用于識別正在處理的對象的類型。與 typeof 方法不同的是,instanceof 方法要求開發者明確地確認對象為某特定類型。例如:

清單 1. instanceof 示例

var oStringObject = new String("hello world"); console.log(oStringObject instanceof String); // 輸出 "true"

這段代碼問的是“變量 oStringObject 是否為 String 對象的實例?”oStringObject 的確是 String 對象的實例,因此結果是"true"。盡管不像 typeof 方法那樣靈活,但是在 typeof 方法返回 "object" 的情況下,instanceof 方法還是很有用的。

instanceof 運算符的常規用法

通常來講,使用 instanceof 就是判斷一個實例是否屬于某種類型。例如:

清單 2. instanceof 常規用法

// 判斷 foo 是否是 Foo 類的實例function Foo(){} var foo = new Foo(); console.log(foo instanceof Foo)//true

另外,更重的一點是 instanceof 可以在繼承關系中用來判斷一個實例是否屬于它的父類型。例如:

清單 3. instanceof 在繼承中關系中的用法

// 判斷 foo 是否是 Foo 類的實例 , 并且是否是其父類型的實例function Aoo(){} function Foo(){} Foo.prototype = new Aoo();//JavaScript 原型繼承var foo = new Foo(); console.log(foo instanceof Foo)//true console.log(foo instanceof Aoo)//true

上面的代碼中是判斷了一層繼承關系中的父類,在多層繼承關系中,instanceof 運算符同樣適用。

你真的了解 instanceof 操作符嗎?

看了上面的代碼示例,是不是覺得 instanceof 操作符很簡單,下面來看點復雜的用法。

清單 4. instanceof 復雜用法

console.log(Object instanceof Object);//true console.log(Function instanceof Function);//true console.log(Number instanceof Number);//false console.log(String instanceof String);//false console.log(Function instanceof Object);//true console.log(Foo instanceof Function);//true console.log(Foo instanceof Foo);//false

看了上面的代碼是不是又暈頭轉向了?為什么 Object 和 Function instanceof 自己等于 true,而其他類 instanceof 自己卻又不等于 true 呢?如何解釋?要想從根本上了解 instanceof 的奧秘,需要從兩個方面著手:1,語言規范中是如何定義這個運算符的。2,JavaScript 原型繼承機制。

詳細剖析 ECMAScript-262 edition 3 中 instanceof 運算符的定義

語言規范對中 instanceof 運算符的定義如下:

清單 5. 規范中 instanceof 運算符定義

11.8.6 The instanceof operator The production RelationalExpression: RelationalExpression instanceof ShiftExpression is evaluated as follows: 1. Evaluate RelationalExpression. 2. Call GetValue(Result(1)).// 調用 GetValue 方法得到 Result(1) 的值,設為 Result(2) 3. Evaluate ShiftExpression. 4. Call GetValue(Result(3)).// 同理,這里設為 Result(4) 5. If Result(4) is not an object, throw a TypeError exception.// 如果 Result(4) 不是 object,//拋出異常/* 如果 Result(4) 沒有 [[HasInstance]] 方法,拋出異常。規范中的所有 [[...]] 方法或者屬性都是內部的,在 JavaScript 中不能直接使用。并且規范中說明,只有 Function 對象實現了 [[HasInstance]] 方法。所以這里可以簡單的理解為:如果 Result(4) 不是 Function 對象,拋出異常 */ 6. If Result(4) does not have a [[HasInstance]] method, throw a TypeError exception. // 相當于這樣調用:Result(4).[[HasInstance]](Result(2)) 7. Call the [[HasInstance]] method of Result(4) with parameter Result(2). 8. Return Result(7). // 相關的 HasInstance 方法定義15.3.5.3 [[HasInstance]] (V) Assume F is a Function object.// 這里 F 就是上面的 Result(4),V 是 Result(2) When the [[HasInstance]] method of F is called with value V, the following steps are taken: 1. If V is not an object, return false.// 如果 V 不是 object,直接返回 false 2. Call the [[Get]] method of F with property name "prototype".// 用 [[Get]] 方法取 // F 的 prototype 屬性3. Let O be Result(2).//O = F.[[Get]]("prototype") 4. If O is not an object, throw a TypeError exception. 5. Let V be the value of the [[Prototype]] property of V.//V = V.[[Prototype]] 6. If V is null, return false. // 這里是關鍵,如果 O 和 V 引用的是同一個對象,則返回 true;否則,到 Step 8 返回 Step 5 繼續循環7. If O and V refer to the same object or if they refer to objects joined to each other (section 13.1.2), return true. 8. Go to step 5.

上面的規范定義很晦澀,而且看起來比較復雜,涉及到很多概念,但把這段規范翻譯成 JavaScript 代碼卻很簡單,如下:

清單 6. JavaScript instanceof 運算符代碼

function instance_of(L, R) {//L 表示左表達式,R 表示右表達式var O = R.prototype;// 取 R 的顯示原型L = L.__proto__;// 取 L 的隱式原型while (true) { if (L === null) return false; if (O === L)// 這里重點:當 O 嚴格等于 L 時,返回 true return true; L = L.__proto__; } }

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 原型繼承的基礎知識,在這里就不在敘述了。

JavaScript,instanceof,運算符

JavaScript 原型鏈

講解 instanceof 復雜用法

有了上面 instanceof 運算符的 JavaScript 代碼和原型繼承圖,再來理解 instanceof 運算符將易如反掌。下面將詳細講解 Object instanceof Object,Function instanceof Function 和 Foo instanceof Foo 三個示例,其它示例讀者可自行推演。

清單 7. Object instanceof Object

// 為了方便表述,首先區分左側表達式和右側表達式ObjectL = Object, ObjectR = Object; // 下面根據規范逐步推演O = ObjectR.prototype = Object.prototype L = ObjectL.__proto__ = Function.prototype // 第一次判斷O != L // 循環查找 L 是否還有 __proto__ L = Function.prototype.__proto__ = Object.prototype // 第二次判斷O == L // 返回 true

清單 8. Function instanceof Function

// 為了方便表述,首先區分左側表達式和右側表達式FunctionL = Function, FunctionR = Function; // 下面根據規范逐步推演O = FunctionR.prototype = Function.prototype L = FunctionL.__proto__ = Function.prototype // 第一次判斷O == L // 返回 true

清單 9. Foo instanceof Foo

// 為了方便表述,首先區分左側表達式和右側表達式FooL = Foo, FooR = Foo; // 下面根據規范逐步推演O = FooR.prototype = Foo.prototype L = FooL.__proto__ = Function.prototype // 第一次判斷O != L // 循環再次查找 L 是否還有 __proto__ L = Function.prototype.__proto__ = Object.prototype // 第二次判斷O != L // 再次循環查找 L 是否還有 __proto__ L = Object.prototype.__proto__ = null // 第三次判斷L == null // 返回 false

簡析 instanceof 在 Dojo 繼承機制中的應用

在 JavaScript 中,是沒有多重繼承這個概念的,就像 Java 一樣。但在 Dojo 中使用 declare 聲明類時,是允許繼承自多個類的。下面以 Dojo 1.6.1 為例。

清單 10. Dojo 中多重繼承

dojo.declare("Aoo",null,{}); dojo.declare("Boo",null,{}); dojo.declare("Foo",[Aoo,Boo],{}); var foo = new Foo(); console.log(foo instanceof Aoo);//true console.log(foo instanceof Boo);//false console.log(foo.isInstanceOf(Aoo));//true console.log(foo.isInstanceOf(Boo));//true

上面的示例中,Foo 同時繼承自 Aoo 和 Boo,但當使用 instanceof 運算符來檢查 foo 是否是 Boo 的實例時,返回的是 false。實際上,在 Dojo 的內部,Foo 仍然只繼承自 Aoo,而通過 mixin 機制把 Boo 類中的方法和屬性拷貝到 Foo 中,所以當用 instanceof 運算符來檢查是否是 Boo 的實例時,會返回 false。所以 Dojo 為每個類的實例添加了一個新的方法叫 isInstanceOf,用這個方法來檢查多重繼承。

結束語

本文詳細介紹了 JavaScript 語言中 instanceof 運算符,并且結合語言規范深入剖析了此操作符的算法。對讀者使用 JavaScript 編寫復雜的面向對象程序會有很大的幫助。本文所有代碼在 Firefox 15 下通過測試。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91精品久久久久久久久久久| 亚洲亚裔videos黑人hd| 91精品国产色综合| 日韩精品有码在线观看| 奇米影视亚洲狠狠色| 国产精品一久久香蕉国产线看观看| 九色精品美女在线| 91香蕉嫩草影院入口| 国产欧美一区二区三区在线| 日韩av在线网站| 国产成人鲁鲁免费视频a| 欧美日韩在线视频一区| 欧美精品中文字幕一区| 国产精品女人久久久久久| 国产精品三级久久久久久电影| 久久精品99久久久香蕉| 欧美激情影音先锋| 欧美在线一区二区三区四| 久久久久九九九九| 亚洲偷欧美偷国内偷| 国内精品中文字幕| 国产一区二区三区三区在线观看| 国产成人精品久久二区二区| 欧美电影免费观看大全| 国产欧美精品一区二区三区介绍| 欧美日韩免费一区| 精品国偷自产在线| 98精品国产自产在线观看| 在线视频精品一| 精品亚洲国产视频| 亚洲深夜福利视频| 日韩精品福利在线| 欧美日韩在线免费| 国产精品ⅴa在线观看h| 中文字幕久热精品视频在线| 亚洲色图美腿丝袜| 岛国av一区二区在线在线观看| 久久亚洲一区二区三区四区五区高| 久久全球大尺度高清视频| 欧美电影院免费观看| 久久亚洲春色中文字幕| 久久久精品视频在线观看| 亚洲国产精品字幕| 国产综合在线视频| 日韩中文综合网| 992tv成人免费视频| 日韩一区二区福利| 国产精品久久久久久久久久久久久久| 亚洲欧美在线免费观看| 日韩av免费网站| 亚洲黄色www| 亚洲精品成人网| 欧美韩国理论所午夜片917电影| 97精品免费视频| 国产成人97精品免费看片| 国产欧美一区二区| 97视频在线观看网址| 亚洲欧洲黄色网| 亚洲一品av免费观看| 亚洲国产精品电影| 中文字幕欧美专区| 中文字幕在线日韩| 亚洲视频精品在线| 国产精品扒开腿做| 亚洲欧美日韩视频一区| 色噜噜狠狠狠综合曰曰曰88av| 久久影院资源站| 亚洲电影免费观看高清完整版在线观看| 2019中文字幕在线观看| 欧美日韩中文在线观看| 国内精品一区二区三区四区| 久久久久久这里只有精品| 亚洲欧美综合精品久久成人| 欧美中文字幕视频| 777国产偷窥盗摄精品视频| 欧美俄罗斯乱妇| 国模精品视频一区二区三区| 色先锋资源久久综合5566| 九九热精品视频在线播放| 久久福利网址导航| 欧美日韩国产在线| 在线播放日韩专区| 精品福利视频导航| 成人看片人aa| 18一19gay欧美视频网站| 伊人男人综合视频网| 91精品视频在线| 日韩精品在线第一页| 亚洲精品久久久久国产| 亚洲精品女av网站| 日韩中文字幕在线免费观看| 日韩av黄色在线观看| 日韩av在线免费| 日韩hd视频在线观看| 国产在线观看精品| 国产一区二区三区在线播放免费观看| 欧美日韩免费在线观看| 亚洲片在线资源| 成人免费淫片视频软件| 国产精品成人免费视频| 久久99国产综合精品女同| 日韩精品视频三区| 欧美性生交xxxxxdddd| 久久综合五月天| 国产成人精品视频在线| 草民午夜欧美限制a级福利片| 国产欧美一区二区三区在线看| 国产精品尤物福利片在线观看| 国产日韩欧美综合| 久久频这里精品99香蕉| 68精品久久久久久欧美| 在线日韩第一页| 精品欧美激情精品一区| 成人激情在线观看| 亚洲精品小视频在线观看| 国产午夜精品理论片a级探花| 日韩精品极品毛片系列视频| 91九色国产社区在线观看| 最近2019年好看中文字幕视频| 成人在线小视频| 欧美日韩亚洲一区二区| 成人黄色av播放免费| 国产精品久久77777| 亚洲第一视频在线观看| 亚洲女人被黑人巨大进入| 国产精品无码专区在线观看| 国产丝袜一区二区| 欧美极品在线播放| 热门国产精品亚洲第一区在线| 国产v综合ⅴ日韩v欧美大片| 欧美成人全部免费| 亚洲香蕉伊综合在人在线视看| 国产成人精品在线观看| 中文字幕日韩在线播放| 亚洲精品一区二区三区不| 国产精品免费久久久久久| 久久香蕉频线观| 久久天天躁狠狠躁夜夜躁| 欧美疯狂性受xxxxx另类| 欧美国产中文字幕| 欧美—级a级欧美特级ar全黄| 清纯唯美日韩制服另类| 永久免费精品影视网站| 欧美视频在线观看 亚洲欧| 97av在线影院| 欧美精品videos性欧美| 亚洲天堂第一页| 免费91麻豆精品国产自产在线观看| 午夜伦理精品一区| 成人免费视频网| 国产精品电影在线观看| 亚洲女人天堂视频| 成人午夜激情网| 亚洲美女自拍视频| 精品久久久久久中文字幕一区奶水| 国产欧美一区二区| 91在线观看免费高清完整版在线观看| www.美女亚洲精品| 欧美另类极品videosbestfree| 欧美在线视频一区二区| 欧美色视频日本高清在线观看| 欧美日韩亚洲一区二| 在线午夜精品自拍| 久久久亚洲国产|