JavaScript 手動實現instanceof的方法
1. instanceof的用法
instanceof
運算子用於檢測建構函式的
prototype
屬性是否出現在某個
例項物件的
原型鏈上。
function Person() {} function Person2() {} const usr = new Person(); console.log(usr instanceof Person); // true console.log(usr instanceof Object); // true console.log(usr instanceof Person2); // false
如上程式碼,定義了兩個建構函式,
Person
和
Person2
,又實用
new
操作建立了一個
Person
的例項物件
usr
。
實用
instanceof
操作符,分別檢驗
建構函式的
prototype
屬性是否在
usr
這個例項的原型鏈上。
當然,結果顯示,
Person
和
Object
的
prototype
屬性在
usr
的原型鏈上。
usr
不是
Person2
的例項,故
Person2
的
prototype
屬性不在
usr
的原型鏈上。
2. 實現instanceof
明白了
instanceof
的功能和原理後,可以自己實現一個
instanceof
同樣功能的函式:
function myInstanceof(obj, constructor) { // obj的隱式原型 let implicitPrototype = obj?.__proto__; // 建構函式的原型 const displayPrototype = constructor.prototype; // 遍歷原型鏈 while (implicitPrototype) { // 找到,返回true if (implicitPrototype === displayPrototype) return true; implicitPrototype = implicitPrototype.__proto__; } // 遍歷結束還沒找到,返回false return false; }
myInstanceof
函式接收兩個引數:例項物件
obj
和建構函式
constructor
。
首先拿到例項物件的隱式原型:
obj.__proto__
,建構函式的原型物件
constructor.prototype
。
接著,就可以通過不斷得到上一級的 隱式原型:
來遍歷原型鏈,尋找
displayPrototype
是否在原型鏈上,若找到,返回
true
。
當
implicitPrototype
為
null
時,結束尋找,沒有找到,返回
false
。
原型鏈其實就是一個類似 連結串列的資料結構。
instanceof
做的事,就是在連結串列上 尋找有沒有目標節點。從表頭節點開始,不斷向後遍歷,若找到目標節點,返回true
。遍歷結束還沒找到,返回false
。
3. 驗證
寫一個簡單的例項驗證一下自己實現的
instanceof
:
function Person() {} function Person2() {} const usr = new Person(); function myInstanceof(obj, constructor) { let implicitPrototype = obj?.__proto__; const displayPrototype = constructor.prototype; while (implicitPrototype) { if (implicitPrototype === displayPrototype) return true; implicitPrototype = implicitPrototype.__proto__; } return false; } myInstanceof(usr, Person); // true myInstanceof(usr, Object); // true myInstanceof(usr, Person2); // false myInstanceof(usr, Function); // false myInstanceof(usr.__proto__, Person); // false usr.__proto__ instanceof Person; // false
可以看到,
myInstanceof
正確得出了結果。
有趣的是,
usr.__proto__ instanceof Person
返回
false
,說明
obj instanceof constructor
檢測的原型鏈,
不包括
obj
節點本身。
JavaScript常見手寫程式碼:
到此這篇關於JavaScript 手動實現instanceof的文章就介紹到這了,更多相關JavaScript instanceof內容請搜尋指令碼之家以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援指令碼之家!
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70015111/viewspace-2869927/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- JavaScript自我實現系列(1):instanceofJavaScript
- JavaScript instanceofJavaScript
- 動手實現一個JavaScript的AOP(一)JavaScript
- 說說instanceof和typeof的實現原理並自己模擬實現一個instanceof
- javascript instanceof的原型介紹JavaScript原型
- 淺談 instanceof 和 typeof 的實現原理
- 如何用JavaScript手動實現一個棧JavaScript
- bind/new/instanceof/assign模擬實現
- JavaScript實現淺拷貝的方法JavaScript
- JavaScript模擬實現replaceAll方法JavaScript
- javascript實現tab切換的四種方法JavaScript
- new&instanceof原理解析及模擬實現
- MHA實現mysql主從資料庫手動切換的方法MySql資料庫
- JavaScript手寫new方法JavaScript
- 自己動手實現OkHttpHTTP
- 動手實現一個localcache - 實現篇
- [javascript]如何優雅的實現網頁自動滾動JavaScript網頁
- JavaScript實現專案列表的增刪移動JavaScript
- 手撕Vuex-實現mutations方法Vue
- 手撕Vuex-實現actions方法Vue
- instanceof
- 手動實現ArrayList動態陣列陣列
- 自己動手實現Java中的StringBuffer類Java
- 動手實現一個簡單的promisePromise
- JavaScript代理模式,怎麼實現物件的動態代理?JavaScript模式物件
- JavaScript模擬拋物運動的程式碼實現JavaScript
- JavaScript實現手機拍攝圖片的旋轉、壓縮JavaScript
- 用例驅動實現DDD的方法 - codex
- Javascript中currying的實現JavaScript
- iView Upload 實現手動上傳View
- 動手實現一個 LRU cache
- 【JAVA】ArrayList手動實現(初級)Java
- ARouter原理剖析及手動實現
- canvas實現手動繪製矩形Canvas
- 手動實現HTML外掛BeautifyHTML
- instanceof 原理
- 自己動手實現一個簡單的 IOC
- Spring系列之DI的原理及手動實現Spring