JavaScript instanceof
我們說不要以貌取人,在人際交往中這一點非常重要。
但是在程式設計中,建議"以貌取人",從長相可以大致猜測功能。
instanceof由單詞instance與of構成,instance是例項的意思,of表示從屬關係。
它可以判斷物件是否是指定建構函式(類)的例項,如果是則返回true,否則返回false。
事實上,只要建構函式的prototype原型物件在物件的原型鏈上,就會返回true。
也就是說此運算子可以判斷是否指定類或者父類的例項。
語法結構:
[JavaScript] 純文字檢視 複製程式碼object instanceof class
引數解析:
(1).object:物件例項,判斷它是否是某個類或者父類的例項。
(2).class:一個類,或者說建構函式。
只要class的原型物件處於object物件原型鏈上的任何位置,運算子返回true。
關於原型鏈相關知識可以參閱JavaScript 原型鏈一章節。
程式碼例項:
[JavaScript] 純文字檢視 複製程式碼執行程式碼function Antzone(webName,age){ this.name=webName; this.age=age; } let ant=new Antzone('螞蟻部落',5); console.log(ant.__proto__ === Antzone.prototype); console.log(ant instanceof Antzone);
程式碼執行效果截圖如下:
ant.__proto__ === Antzone.prototype返回true,可見Antzone原型物件位於物件ant原型鏈之上。
所以運算子返回true,這個很容易理解,更多內容參閱如下兩篇文章:
(1).prototype屬性可以參閱JavaScript prototype 原型一章節。
(2).__proto__屬性可以參閱__proto__屬性一章節。
[JavaScript] 純文字檢視 複製程式碼執行程式碼function Antzone(webName,age){ this.name=webName; this.age=age; } let ant=new Antzone('螞蟻部落',5); console.log(ant.__proto__ === Antzone.prototype); console.log(Antzone.prototype.__proto__ === Object.prototype); console.log(ant instanceof Object);
程式碼執行效果截圖如下:
物件例項ant並非由Object建構函式直接建立。
但是運算子依然返回true,因為Object.prototype在ant的原型鏈之上。
這說明建構函式Antzone與Object之間存在繼承關係。
不過需要注意如下兩點:
(1).如果建構函式的prototype物件被人為改變,那麼返回值有可能是false。
(2).同樣道理,如果物件例項的__proto__被改變,那麼返回值同樣有可能是false。
還有一點需要特別注意,程式碼例項如下:
[JavaScript] 純文字檢視 複製程式碼執行程式碼let one="antzone"; let two=new String("antzone"); console.log(one instanceof String); console.log(two instanceof String)
程式碼執行效果截圖如下:
通常來講,通過建構函式建立的物件應用instanceof運算子才會返回true。
但是陣列直接量和物件直接量是例外,程式碼例項如下:
[JavaScript] 純文字檢視 複製程式碼執行程式碼let one=[]; let two={}; console.log(one instanceof Array); console.log(two instanceof Object)
程式碼執行效果截圖如下:
二.instanceof深入分享:
上面是運算子最為基本的使用規則,一切都是按照理論按部就班,非常容易理解。
但是也有很多讓人匪夷所思的現象,程式碼例項如下:
[JavaScript] 純文字檢視 複製程式碼執行程式碼function Antzone(webName,age){ this.name=webName; this.age=age; } 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(Antzone instanceof Function);//true
程式碼執行效果截圖如下:
instanceof與繼承密切相關,下面分享一個著名的關於物件間繼承關係的圖片。
下面僅以Object instanceof Object返回true為例子做一下分析。
程式碼如下:
[JavaScript] 純文字檢視 複製程式碼執行程式碼ObjectL = Object; ObjectR = Object; console.log(ObjectL.__proto__ === Function.prototype) //true console.log(Function.prototype.__proto__ === ObjectR.prototype) // true
程式碼執行效果截圖如下:
結合繼承關係圖,可以一步一步的推匯出ObjectR.prototype在ObjectL的原型鏈上。
那麼Object instanceof Object返回true就是理所當然的事情了。
相關文章
- javascript instanceof的原型介紹JavaScript原型
- JavaScript自我實現系列(1):instanceofJavaScript
- JavaScript 手動實現instanceof的方法JavaScript
- instanceof
- instanceof 原理
- Java 中 instanceof 關鍵字 object instanceof ClassJavaObject
- instanceof 含義
- 【前端面試】instanceof原理前端面試
- instanceof 是如何工作的
- instanceof和typeof的區別
- 說說instanceof和typeof的實現原理並自己模擬實現一個instanceof
- 【重溫基礎】instanceof運算子
- java中的instanceof關鍵字Java
- Java 16 新特性:instanceof增強Java
- JS物件操作(in、instanceof、delete)運算子JS物件delete
- bind/new/instanceof/assign模擬實現
- Class.isAssignableFrom與instanceof的區別
- java-----instanceof與getClass的區別Java
- 淺談 instanceof 和 typeof 的實現原理
- new&instanceof原理解析及模擬實現
- 向下轉型的注意事項與instanceof的使用
- JS-資料型別- typeof/instanceof/Object.prototype.toStringJS資料型別Object
- 深入瞭解typeof與instanceof的使用場景及注意事項
- "instanceof 的原理是什麼"?大聲告訴面試官,我知道!面試
- 高階JAVA碼農必須搞清楚它們的區別:instanceof、isInstance、isAssignableFromJava
- js--typeof 和 instanceof 判斷資料型別的區別及開發中的使用JS資料型別
- JavaScript高階:JavaScript物件導向,JavaScript內建物件,JavaScript BOM,JavaScript封裝JavaScript物件封裝
- javaScript系列[06]-javaScript和thisJavaScript
- [Javascript] How javascript read the property?JavaScript
- javaScript系列[05]-javaScript和JSONJavaScriptJSON
- “This” is For JavaScriptJavaScript
- This in JavaScriptJavaScript
- JavaScript -"this"JavaScript
- JavaScriptJavaScript
- javascript ??JavaScript
- 44 道 JavaScript 難題(JavaScript Puzzlers!)JavaScript
- [Javascript] Understanding JavaScript Proxies with Symbol.toPrimitiveJavaScriptSymbolMIT
- JS開發者應懂的33個概念系列5(下)--typeof 與 instanceof && 23--原型繼承與原型鏈JS原型繼承