JavaScript檢查某個function是否是原生代碼的方法
我總是經(jīng)常碰到需要檢查某個function是否是原生代碼的情況 —— 這是功能測試中一個很重要的內(nèi)容: 函數(shù)是瀏覽器內(nèi)置支持的,還是通過第三方類庫模擬的。要檢測這一點,最簡單的辦法當(dāng)然是判斷函數(shù)的 toString 方法返回的值啦。
JavaScript代碼
判斷函數(shù)是否是原生方法其實相當(dāng)簡單:
// 判斷是否原生函數(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; // 用于檢測 宿主對象構(gòu)造器(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) // 對所有正則表達(dá)式相關(guān)的特殊字符進行轉(zhuǎn)義 .replace(/[.*+?^${}()|[\]\/\\]/g, '\\$&') // 為了保持模板的通用性,將 `toString` 替換為 `.*?` // 將`for ...`之類的字符替換,兼容Rhino等環(huán)境,因為他們會有額外的信息,如方法的參數(shù)數(shù)量. .replace(/toString|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') // 結(jié)束符 + '$' ); 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 之類的東西當(dāng)作DOM方法 // 此時可能不匹配標(biāo)準(zhǔn)的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
相關(guān)文章
jquery中l(wèi)ive()方法和bind()方法區(qū)別分析
這篇文章主要介紹了jquery中l(wèi)ive()方法和bind()方法區(qū)別,結(jié)合實例形式簡單分析了live()方法和bind()方法的功能、使用方法與用法區(qū)別,需要的朋友可以參考下2016-06-06JavaScript實現(xiàn)單擊下拉框選擇直接跳轉(zhuǎn)頁面的方法
這篇文章主要介紹了JavaScript實現(xiàn)單擊下拉框選擇直接跳轉(zhuǎn)頁面的方法,涉及javascript控制頁面跳轉(zhuǎn)的相關(guān)技巧,需要的朋友可以參考下2015-07-07JS實現(xiàn)數(shù)組去重復(fù)值的方法示例
這篇文章主要介紹了JS實現(xiàn)數(shù)組去重復(fù)值的方法,結(jié)合實例形式分析了JS通過數(shù)組遍歷、運算等方法實現(xiàn)去重復(fù)值的操作技巧,需要的朋友可以參考下2017-02-02使用JavaScript動態(tài)設(shè)置樣式實現(xiàn)代碼(2)
使用onmouseover和onmouseout事件實現(xiàn)不同的效果而且是使用js動態(tài)實現(xiàn),本文有利于鞏固你js與css方面的知識,感興趣的你可以了解下哦,希望本文對你有所幫助2013-01-01