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
- 如何用JavaScript手動實現一個棧JavaScript
- javascript instanceof的原型介紹JavaScript原型
- 淺談 instanceof 和 typeof 的實現原理
- javascript實現資料的雙向繫結(手動繫結)JavaScript
- Java instanceof 關鍵字是如何實現的?Java
- JavaScript實現淺拷貝的方法JavaScript
- JavaScript instanceof 運算子深入剖析JavaScript
- 手動實現KVO
- 手動實現PromisePromise
- bind/new/instanceof/assign模擬實現
- JavaScript人臉檢測的實現方法JavaScript
- JavaScript實現非同步的4種方法JavaScript非同步
- JavaScript模擬實現replaceAll方法JavaScript
- javascript 偽陣列實現方法JavaScript陣列
- MHA實現mysql主從資料庫手動切換的方法MySql資料庫
- 自己動手實現OkHttpHTTP
- 手動實現 DI 容器
- javascript實現的運動框架詳解JavaScript框架
- javascript實現tab切換的四種方法JavaScript
- javascript物件導向的方法過載的實現JavaScript物件
- 動手實現一個localcache - 實現篇
- 原生 JavaScript 實現手勢解鎖元件JavaScript元件
- javascript實現圖片滾動JavaScript
- JavaScript中typeof和instanceof深入詳解JavaScript
- 動手實現你的依賴注入依賴注入
- JavaScript手寫new方法JavaScript
- new&instanceof原理解析及模擬實現
- javascript實現的動態時間日期效果JavaScript
- JavaScript圖片裁剪的無變形實現方法JavaScript
- 手動實現ArrayList動態陣列陣列
- 手撕Vuex-實現mutations方法Vue
- 手撕Vuex-實現actions方法Vue
- javascript實現動態側邊欄JavaScript
- 動手實現一個簡單的promisePromise
- Javascript閉包深入解析及實現方法JavaScript