JavaScript中判斷原生函數(shù)檢查function是否是原生代碼
我總是經(jīng)常碰到需要檢查某個(gè)function是否是原生代碼的情況 —— 這是功能測(cè)試中一個(gè)很重要的內(nèi)容: 函數(shù)是瀏覽器內(nèi)置支持的,還是通過第三方類庫(kù)模擬的。要檢測(cè)這一點(diǎn),最簡(jiǎn)單的辦法當(dāng)然是判斷函數(shù)的 toString 方法返回的值啦。
JavaScript代碼
判斷函數(shù)是否是原生方法其實(shí)相當(dāng)簡(jiǎn)單:
// 判斷是否原生函數(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í)行正則匹配,這就是實(shí)現(xiàn)的原理。
升級(jí)版,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;
// 用于檢測(cè) 宿主對(duì)象構(gòu)造器(host constructors),
// (Safari > 4; 真的輸出特定的數(shù)組,really typed array specific)
var reHostCtor = /^\[object .+?Constructor\]$/;
// 使用RegExp將常用的native方法編譯為正則模板.
// 使用 `Object#toString` 是因?yàn)橐话闼粫?huì)被污染
var reNative = RegExp('^' +
// 將 `Object#toString` 強(qiáng)轉(zhuǎn)為字符串
String(toString)
// 對(duì)所有正則表達(dá)式相關(guān)的特殊字符進(jìn)行轉(zhuǎn)義
.replace(/[.*+?^${}()|[\]\/\\]/g, '\\$&')
// 為了保持模板的通用性,將 `toString` 替換為 `.*?`
// 將`for ...`之類的字符替換,兼容Rhino等環(huán)境,因?yàn)樗麄儠?huì)有額外的信息,如方法的參數(shù)數(shù)量.
.replace(/toString|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?')
// 結(jié)束符
+ '$'
);
function isNative(value) {
// 判斷 typeof
var type = typeof value;
return type == 'function'
// 使用 `Function#toString`原生方法來(lái)調(diào)用,
// 而不是 value 自己的 `toString` 方法,
// 以免被偽造所欺騙.
? reNative.test(fnToString.call(value))
// 如果type 不是'function',
// 則需要檢查宿主對(duì)象(host object)的情形,
// 因?yàn)槟承?瀏覽器)環(huán)境會(huì)將 typed arrays 之類的東西當(dāng)作DOM方法
// 此時(shí)可能不匹配標(biāo)準(zhǔn)的Native正則模式
: (value && type == 'object' && reHostCtor.test(toString.call(value))) || false;
};
// 可以將 isNative 賦值給你想要的變量/對(duì)象
window.isNative = isNative;
}());
測(cè)試代碼:
isNative(isNative) //false isNative(alert) //true window.isNative(window.isNative) //false window.isNative(window.alert) //true window.isNative(String.toString) //true
- 淺談JavaScript函數(shù)的四種存在形態(tài)
- JavaScript中判斷函數(shù)、變量是否存在
- javascript版的in_array函數(shù)(判斷數(shù)組中是否存在特定值)
- js 判斷js函數(shù)、變量是否存在的簡(jiǎn)單示例代碼
- Javascript 判斷是否存在函數(shù)的方法
- JavaScript基于自定義函數(shù)判斷變量類型的實(shí)現(xiàn)方法
- JS自定義函數(shù)對(duì)web前端上傳的文件進(jìn)行類型大小判斷
- 判斷數(shù)組是否包含某個(gè)元素的js函數(shù)實(shí)現(xiàn)方法
- JavaScript判斷頁(yè)面加載完之后再執(zhí)行預(yù)定函數(shù)的技巧
- javascript判斷css3動(dòng)畫結(jié)束 css3動(dòng)畫結(jié)束的回調(diào)函數(shù)
- JavaScript中判斷變量是數(shù)組、函數(shù)或是對(duì)象類型的方法
- JavaScript判斷變量是否為空的自定義函數(shù)分享
- JS簡(jiǎn)單判斷函數(shù)是否存在的方法
相關(guān)文章
js文件中調(diào)用js的實(shí)現(xiàn)方法小結(jié)
JavaScript文件引用JavaScript文件的方法,需要的朋友可以參考下。2009-10-10
IE中radio 或checkbox的checked屬性初始狀態(tài)下不能選中顯示問題
checked屬性在IE下不能正確實(shí)現(xiàn)的問題2009-07-07
原生JavaScript實(shí)現(xiàn)精美的淘寶輪播圖效果示例【附demo源碼下載】
這篇文章主要介紹了原生JavaScript實(shí)現(xiàn)精美的淘寶輪播圖效果,結(jié)合完整實(shí)例形式詳細(xì)分析了javascript實(shí)現(xiàn)淘寶輪播圖功能的相關(guān)HTML布局、css及js核心功能代碼,并附帶demo源碼供讀者下載參考,需要的朋友可以參考下2017-05-05
為Javascript中的String對(duì)象添加去除左右空格的方法(示例代碼)
這篇文章主要介紹了為Javascript中的String對(duì)象添加去除左右空格的方法(示例代碼)。需要的朋友可以過來(lái)參考下,希望對(duì)大家有所幫助2013-11-11
Javascript中內(nèi)建函數(shù)reduce的應(yīng)用詳解
內(nèi)建函數(shù)其實(shí)就是內(nèi)置函數(shù),reduce函數(shù)是ECMAScript5規(guī)范中出現(xiàn)的數(shù)組方法。在平時(shí)的工作中,相信大家使用的場(chǎng)景并不多,這篇文章給大家詳細(xì)介紹了函數(shù)reduce的應(yīng)用以及多重疊加,有需要的朋友們可以參考借鑒,下面來(lái)一起看看吧。2016-10-10
如何使用bootstrap框架 bootstrap入門必看!
如何使用bootstrap?這篇文章就是告訴大家如何使用bootstrap框架,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04
js實(shí)現(xiàn)的復(fù)制兼容chrome和IE
這篇文章主要介紹了js在chrome和IE下分別實(shí)現(xiàn)復(fù)制,需要的朋友可以參考下2014-04-04
一個(gè)簡(jiǎn)單的Node.js異步操作管理器分享
這篇文章主要介紹了一個(gè)簡(jiǎn)單的Node.js異步操作管理器分享,需要的朋友可以參考下2014-04-04
getElementsByTagName vs selectNodes效率 及兼容的selectNodes實(shí)現(xiàn)
天在csdn上看到有人問 getElementsByTagName 和 selectNodes誰(shuí)更快 ,這個(gè)還真沒研究過。2010-02-02

