js如何判斷一個方法是內建的還是自定義的
可能在實際應用中有這樣的需求,判斷一個方法是JavaScript內建的,還是自定義的。
當然這樣的需求並不多,下面就通過程式碼示例做一下介紹,先看一段程式碼示例:
[JavaScript] 純文字檢視 複製程式碼console.log(alert.toString());
特別說明:本站編輯器無法正確執行上面的程式碼,在本機測試。
執行結果截圖如下:
內建的方法會隱藏內部實現,會顯示上圖所示的內容,所以利用這個特點就可以實現簡單的判斷功能。
程式碼如下:
[JavaScript] 純文字檢視 複製程式碼function isNative(fn) { return (/\{\s*\[native code\]\s*\}/).test('' + fn); } console.log(isNative(alert));
特別說明:上面的程式碼依然無法再本編輯器中正常測試,需要在本機進行測試。
''+fn的作用是將函式隱式轉換為字串,和fn.toString()效果一樣。
上面的程式碼比較簡單,還有一位大神寫的比較完美的程式碼,也可以實現此功能,感興趣的朋友可以自行做一下分析。
程式碼如下:
[JavaScript] 純文字檢視 複製程式碼;(function() { // 取得Object的toString方法,用於處理傳入引數value的內部(internal) `[[Class]]` var toString = Object.prototype.toString; // 取得原始的Function的toString方法,用於處理functions的反編譯程式碼 var fnToString = Function.prototype.toString; // 用於檢測 宿主物件構造器(host constructors), // (Safari > 4; 真的輸出特定的陣列,really typed array specific) var reHostCtor = /^\[object .+?Constructor\]$/; // 使用RegExp將常用的native方法編譯為正則模板. // 使用 `Object#toString` 是因為一般他不會被汙染 var reNative = RegExp('^' + // 將 `Object#toString` 強轉為字串 String(toString) // 對所有正規表示式相關的特殊字元進行轉義 .replace(/[.*+?^${}()|[\]\/\\]/g, '\\$&') // 為了保持模板的通用性,將 `toString` 替換為 `.*?` // 將`for ...`之類的字元替換,相容Rhino等環境,因為他們會有額外的資訊,如方法的引數數量. .replace(/toString|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') // 結束符 + '$'); function isNative(value) { // 判斷 typeof var type = typeof value; return type == 'function' // 使用 `Function#toString`原生方法來呼叫, // 而不是 value 自己的 `toString` 方法, // 以免被偽造所欺騙. ? reNative.test(fnToString.call(value)) // 如果type 不是'function', // 則需要檢查宿主物件(host object)的情形, // 因為某些(瀏覽器)環境會將 typed arrays 之類的東西當作DOM方法 // 此時可能不匹配標準的Native正則模式 : (value && type == 'object' && reHostCtor.test(toString.call(value))) || false; }; // 可以將 isNative 賦值給你想要的變數/物件 window.isNative = isNative; }());
相關文章
- js判斷一個函式是內建還是自定義程式碼例項JS函式
- js如何判斷一個變數是物件還是nullJS變數物件Null
- js如何判斷一個變數是陣列還是其他物件JS變數陣列物件
- js如何判斷一個變數是數字還是數字字串JS變數字串
- 如何判斷函式是否是javascript內建的函式JavaScript
- js如何判斷物件的屬性值是物件還是陣列JS物件陣列
- js如何判斷一個變數是否是undefinedJS變數Undefined
- js如何判斷屬性是本身具有還是繼承別人的JS繼承
- js如何判斷一個變數是否是一個數字JS變數
- 如何判斷Unix系統的一個庫檔案是32位還是64位的
- js如何判斷一個引數是否是陣列JS陣列
- jquery判斷一個元素是隱藏還是顯示jQuery
- fastjson判斷JSON字串是Object還是List<Object>ASTJSON字串Object
- JDK是如何判斷兩個物件是否相同的?判斷的流程是什麼?JDK物件
- JS 判斷客戶端是iOS還是AndroidJS客戶端iOSAndroid
- Linux下判斷磁碟是SSD還是HDD的3種方法Linux
- 判斷使用的是 x11 還是 wayland
- js 判斷是手機訪問,還是pc訪問JS
- 判斷是android安卓還是ios蘋果系統的js程式碼Android安卓iOS蘋果JS
- 原生js 判斷變數是一個陣列JS變數陣列
- 編寫類 AA ,有一個方法:判斷一個數是奇數 odd 還是偶數, 返回 booleanBoolean
- REDHAT中如何判斷主機的CPU是32位還是64位的Redhat
- js如何判斷一個變數是null、undefined例項程式碼JS變數NullUndefined
- 判斷一個表空間是在備份模式的方法模式
- python如何判斷一個物件是否是列表Python物件
- javascript如何判斷一個變數是否是undefinedJavaScript變數Undefined
- 判斷是蘋果系統還是安卓系統的代蘋果安卓
- 如何判斷是手機還是電腦訪問網站網站
- 如何判斷微信內建瀏覽器(JS & PHP)瀏覽器JSPHP
- Linux shell命令列檢視判斷檔案是內部內建自帶命令還是外部命令Linux命令列
- 如何判斷一個類是從另一個類繼承繼承
- js如何判斷是否是IE瀏覽器JS瀏覽器
- python如何判斷一個數是否是整數Python
- 如何判斷一個場景是否是物聯網?
- javascript如何判斷一個變數是否是整數JavaScript變數
- 如何判斷使用者用的是Android手機還是IOS手機AndroidiOS
- JavaScript判斷陣列還是物件JavaScript陣列物件
- PHP判斷是手機端還是PC端PHP