国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

JavaScript檢查某個function是否是原生代碼的方法

2024-05-06 16:07:50
字體:
來源:轉載
供稿:網友
經常碰到需要檢查某個function是否是原生代碼,要檢測這一點,最簡單的辦法當然是判斷函數的 toString 方法返回的值
 
 

我總是經常碰到需要檢查某個function是否是原生代碼的情況 —— 這是功能測試中一個很重要的內容: 函數是瀏覽器內置支持的,還是通過第三方類庫模擬的。要檢測這一點,最簡單的辦法當然是判斷函數的 toString 方法返回的值啦。

JavaScript代碼

判斷函數是否是原生方法其實相當簡單:

// 判斷是否原生函數 function isNative(fn) { // 示例: // alert.toString() // "function alert() { [native code] }" // '' + fn 利用了js的隱式類型轉換. return (//{/s*/[native code/]/s*/}/).test('' + fn); }

將函數轉換為字符串表示的形式,并且執行正則匹配,這就是實現的原理。

升級版,Update!

;(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; }());
isNative(isNative) //false isNative(alert) //true window.isNative(window.isNative) //false window.isNative(window.alert) //true window.isNative(String.toString) //true
 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 高雄市| 奈曼旗| 巧家县| 娄烦县| 津南区| 潍坊市| 集贤县| 沁水县| 三穗县| 饶阳县| 永新县| 临颍县| 宾川县| 凤冈县| 平邑县| 泰安市| 黑河市| 孟津县| 天峻县| 应城市| 扶风县| 渑池县| 临桂县| 丰镇市| 桐庐县| 如皋市| 新泰市| 霍山县| 博野县| 台东市| 湾仔区| 永昌县| 宜良县| 六枝特区| 翁牛特旗| 磐石市| 安西县| 象山县| 宁国市| 抚州市| 社旗县|