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

JavaScript檢查某個(gè)function是否是原生代碼的方法

 更新時(shí)間:2014年08月20日 17:43:14   投稿:whsnow  
經(jīng)常碰到需要檢查某個(gè)function是否是原生代碼,要檢測(cè)這一點(diǎn),最簡(jiǎn)單的辦法當(dāng)然是判斷函數(shù)的 toString 方法返回的值

我總是經(jīng)常碰到需要檢查某個(gè)function是否是原生代碼的情況 —— 這是功能測(cè)試中一個(gè)很重要的內(nèi)容: 函數(shù)是瀏覽器內(nèi)置支持的,還是通過(guò)第三方類庫(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; 
}());
isNative(isNative) //false 
isNative(alert) //true 
window.isNative(window.isNative) //false 
window.isNative(window.alert) //true 
window.isNative(String.toString) //true

相關(guān)文章

  • javascript面向?qū)ο笕筇卣髦庋b實(shí)例詳解

    javascript面向?qū)ο笕筇卣髦庋b實(shí)例詳解

    這篇文章主要介紹了javascript面向?qū)ο笕筇卣髦庋b,簡(jiǎn)單描述了封裝的基本概念、原理,并結(jié)合實(shí)例形式詳細(xì)分析了javascript面向?qū)ο蟪绦蛟O(shè)計(jì)中封裝的用法與相關(guān)操作注意事項(xiàng),需要的朋友可以參考下
    2019-07-07
  • js實(shí)現(xiàn)分享到隨頁(yè)面滾動(dòng)而滑動(dòng)效果的方法

    js實(shí)現(xiàn)分享到隨頁(yè)面滾動(dòng)而滑動(dòng)效果的方法

    這篇文章主要介紹了js實(shí)現(xiàn)分享到隨頁(yè)面滾動(dòng)而滑動(dòng)效果的方法,實(shí)例分析了javascript操作頁(yè)面元素滾動(dòng)效果的方法,需要的朋友可以參考下
    2015-04-04
  • JavaScript基于ChatGPT?API實(shí)現(xiàn)劃詞翻譯瀏覽器腳本

    JavaScript基于ChatGPT?API實(shí)現(xiàn)劃詞翻譯瀏覽器腳本

    最近?GitHub?上有個(gè)基于?ChatGPT?API?的瀏覽器腳本,openai-translator,?短時(shí)間內(nèi)?star?沖到了?9.7k,拋開?tauri?是使用?rust?部分,那瀏覽器部分實(shí)現(xiàn)還是比較簡(jiǎn)單的,今天我們就來(lái)手動(dòng)實(shí)現(xiàn)一下
    2023-03-03
  • Email地址加密javascript版

    Email地址加密javascript版

    Email地址加密javascript版...
    2006-08-08
  • JS打印gridview實(shí)現(xiàn)原理及代碼

    JS打印gridview實(shí)現(xiàn)原理及代碼

    打印gridview對(duì)于一些童鞋們真的是很陌生啊,不過(guò)沒(méi)有關(guān)系,因?yàn)楸疚牡某霈F(xiàn),或讓你茅塞頓開,好了話不多說(shuō),感興趣的朋友可以了解下,或許對(duì)你學(xué)習(xí)js高級(jí)知識(shí)有所幫助
    2013-02-02
  • 淺析Bootstrap縮略圖組件與警示框組件

    淺析Bootstrap縮略圖組件與警示框組件

    縮略圖在網(wǎng)站中最常用的就是產(chǎn)品列表頁(yè)面,一行顯示幾張圖片,有的在圖片底下帶有標(biāo)題、描述內(nèi)容、按鈕等信息。本文給大家介紹Bootstrap縮略圖組件與警示框組件,感興趣的朋友一起學(xué)習(xí)吧
    2016-04-04
  • HTML5游戲引擎LTweenLite實(shí)現(xiàn)的超帥動(dòng)畫效果(附demo源碼下載)

    HTML5游戲引擎LTweenLite實(shí)現(xiàn)的超帥動(dòng)畫效果(附demo源碼下載)

    這篇文章主要介紹了HTML5游戲引擎LTweenLite實(shí)現(xiàn)的超帥動(dòng)畫效果,詳細(xì)分析了LTweenLite的下載,動(dòng)畫效果的實(shí)現(xiàn)步驟,并附帶完整的demo實(shí)例源碼供讀者下載,需要的朋友可以參考下
    2016-01-01
  • js仿手機(jī)頁(yè)面文件下拉刷新效果

    js仿手機(jī)頁(yè)面文件下拉刷新效果

    這篇文章主要為大家詳細(xì)介紹了js仿手機(jī)頁(yè)面文件的下拉刷新,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • three.js中物體的燈光與陰影設(shè)置

    three.js中物體的燈光與陰影設(shè)置

    本文主要介紹了three.js中物體的燈光與陰影設(shè)置,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • 微信小程序  TLS 版本必須大于等于1.2問(wèn)題解決

    微信小程序 TLS 版本必須大于等于1.2問(wèn)題解決

    這篇文章主要介紹了微信小程序 TLS 版本必須大于等于1.2問(wèn)題解決的相關(guān)資料,需要的朋友可以參考下
    2017-02-02

最新評(píng)論

肥西县| 清镇市| 太谷县| 平远县| 睢宁县| 大连市| 五峰| 襄樊市| 鄂伦春自治旗| 屯留县| 郎溪县| 广灵县| 涟源市| 宜君县| 肇源县| 丹江口市| 泰宁县| 九龙县| 略阳县| 克什克腾旗| 上思县| 奈曼旗| 甘孜| 康马县| 九龙坡区| 巴中市| 临湘市| 宜昌市| 土默特右旗| 梨树县| 泸定县| 新丰县| 潞城市| 竹山县| 临城县| 文山县| 抚州市| 和平区| 济南市| 万山特区| 濉溪县|