JavaScript檢查某個function是否是原生代碼的方法
更新時間:2014年08月20日 17:43:14 投稿:whsnow
經常碰到需要檢查某個function是否是原生代碼,要檢測這一點,最簡單的辦法當然是判斷函數的 toString 方法返回的值
我總是經常碰到需要檢查某個function是否是原生代碼的情況 —— 這是功能測試中一個很重要的內容: 函數是瀏覽器內置支持的,還是通過第三方類庫模擬的。要檢測這一點,最簡單的辦法當然是判斷函數的 toString 方法返回的值啦。
JavaScript代碼
判斷函數是否是原生方法其實相當簡單:
// 判斷是否原生函數
function isNative(fn) {
// 示例:
// alert.toString()
// "function alert() { [native code] }"
// '' + fn 利用了js的隱式類型轉換.
return (/\{\s*\[native code\]\s*\}/).test('' + fn);
}
將函數轉換為字符串表示的形式,并且執(zhí)行正則匹配,這就是實現的原理。
升級版,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等環(huán)境,因為他們會有額外的信息,如方法的參數數量.
.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)的情形,
// 因為某些(瀏覽器)環(huán)境會將 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
相關文章
JavaScript基于ChatGPT?API實現劃詞翻譯瀏覽器腳本
最近?GitHub?上有個基于?ChatGPT?API?的瀏覽器腳本,openai-translator,?短時間內?star?沖到了?9.7k,拋開?tauri?是使用?rust?部分,那瀏覽器部分實現還是比較簡單的,今天我們就來手動實現一下2023-03-03
HTML5游戲引擎LTweenLite實現的超帥動畫效果(附demo源碼下載)
這篇文章主要介紹了HTML5游戲引擎LTweenLite實現的超帥動畫效果,詳細分析了LTweenLite的下載,動畫效果的實現步驟,并附帶完整的demo實例源碼供讀者下載,需要的朋友可以參考下2016-01-01

