js判斷一個函式是內建還是自定義程式碼例項
本章節介紹一下如何判斷一個函式是內建的還是使用者自定義的,這個在實際編碼中也是有需求的。
程式碼例項如下:
[JavaScript] 純文字檢視 複製程式碼function isNative(fn){ return (/\{\s*\[native code\]\s*\}/).test(''+ fn); } console.log(isNative(String.toString));
上面的程式碼實現了我們的要求,原理也非常的簡單,如下程式碼:
[JavaScript] 純文字檢視 複製程式碼[].toString()
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如何判斷一個變數是null、undefined例項程式碼JS變數NullUndefined
- js判斷微信內建瀏覽器程式碼例項JS瀏覽器
- 如何判斷函式是否是javascript內建的函式JavaScript
- js自定義回撥函式簡單程式碼例項JS函式
- js實現的判斷是否是閏年程式碼例項JS
- js如何判斷一個變數是物件還是nullJS變數物件Null
- js如何判斷一個變數是陣列還是其他物件JS變數陣列物件
- 判斷是android安卓還是ios蘋果系統的js程式碼Android安卓iOS蘋果JS
- js如何判斷一個變數是數字還是數字字串JS變數字串
- 判斷oracle是否是rac例項Oracle
- jquery判斷一個元素是隱藏還是顯示jQuery
- js判斷元素是否為空程式碼例項JS
- js判斷IE瀏覽器程式碼例項JS瀏覽器
- js判斷微信瀏覽器程式碼例項JS瀏覽器
- fastjson判斷JSON字串是Object還是List<Object>ASTJSON字串Object
- javascript判斷變數是否是陣列型別程式碼例項JavaScript變數陣列型別
- js判斷一個字串是否為空或者只包含空格程式碼例項JS字串
- js如何判斷一個函式是否存在JS函式
- js的建構函式和原型用法程式碼例項JS函式原型
- JS 判斷客戶端是iOS還是AndroidJS客戶端iOSAndroid
- js判斷文字框是否為空程式碼例項JS
- js判斷瀏覽器型別程式碼例項JS瀏覽器型別
- js判斷螢幕是否旋轉程式碼例項JS
- js冪函式程式碼例項分享JS函式
- JavaScript 判斷變數是否是函式JavaScript變數函式
- Hive函式(內建函式+自定義標準函式UDF)Hive函式
- 判斷手機還是電腦登陸程式碼
- js 判斷是手機訪問,還是pc訪問JS
- 判斷一個時間是否處於指定的時間段內程式碼例項
- js判斷是否是IE瀏覽器程式碼JS瀏覽器
- 原生js 判斷變數是一個陣列JS變數陣列
- js如何判斷一個變數是否是undefinedJS變數Undefined
- 一個自定義函式函式
- js confirm()函式用法程式碼例項JS函式
- js如何判斷一個變數是否是一個數字JS變數
- js判斷變數是不是數字型別程式碼例項JS變數型別
- js判斷陣列中是否含有指定元素程式碼例項JS陣列