最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript中判斷原生函數(shù)檢查function是否是原生代碼

 更新時間:2014年09月09日 16:04:17   投稿:whsnow  
檢查某個function是否是原生代碼,要檢測這一點,最簡單的辦法當然是判斷函數(shù)的 toString 方法返回的值

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

JavaScript代碼

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

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

將函數(shù)轉(zhuǎn)換為字符串表示的形式,并且執(zhí)行正則匹配,這就是實現(xiàn)的原理。

升級版,Update!

;(function() { 

// 取得Object的toString方法,用于處理傳入?yún)?shù)value的內(nèi)部(internal) `[[Class]]` 
var toString = Object.prototype.toString; 

// 取得原始的Function的toString方法,用于處理functions的反編譯代碼 
var fnToString = Function.prototype.toString; 

// 用于檢測 宿主對象構造器(host constructors), 
// (Safari > 4; 真的輸出特定的數(shù)組,really typed array specific) 
var reHostCtor = /^\[object .+?Constructor\]$/; 

// 使用RegExp將常用的native方法編譯為正則模板. 
// 使用 `Object#toString` 是因為一般他不會被污染 
var reNative = RegExp('^' + 
// 將 `Object#toString` 強轉(zhuǎn)為字符串 
String(toString) 
// 對所有正則表達式相關的特殊字符進行轉(zhuǎn)義 
.replace(/[.*+?^${}()|[\]\/\\]/g, '\\$&') 
// 為了保持模板的通用性,將 `toString` 替換為 `.*?` 
// 將`for ...`之類的字符替換,兼容Rhino等環(huán)境,因為他們會有額外的信息,如方法的參數(shù)數(shù)量. 
.replace(/toString|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') 
// 結束符 
+ '$' 
); 

function isNative(value) { 
// 判斷 typeof 
var type = typeof value; 
return type == 'function' 
// 使用 `Function#toString`原生方法來調(diào)用, 
// 而不是 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

相關文章

最新評論

偏关县| 东丰县| 黑水县| 乌拉特前旗| 尉氏县| 疏勒县| 探索| 始兴县| 财经| 宁都县| 枞阳县| 达拉特旗| 平江县| 同心县| 明水县| 开原市| 天台县| 松滋市| 舒城县| 许昌县| 云安县| 富蕴县| 皮山县| 宜章县| 株洲市| 泽库县| 京山县| 克东县| 瑞安市| 囊谦县| 上虞市| 西宁市| 剑川县| 天等县| 施秉县| 正阳县| 务川| 长宁县| 景德镇市| 台州市| 深圳市|