判定是否原生方法的JS代碼
瀏覽器的趨勢(shì)是加入越來(lái)越多對(duì)象,像Worker,同時(shí)也為舊有的對(duì)象添加新方法。如何兼容它的第一步就是檢測(cè)它們是否存在,沒(méi)有則補(bǔ)上自己的兼容代碼。這時(shí)問(wèn)題就來(lái)了,有的類庫(kù)是給你做了這一步,但有時(shí)沒(méi)有,有時(shí)是做了,但并不符合標(biāo)準(zhǔn)。因此單純是typeof Array.prototype.map === "function"可能不夠用。這時(shí)isNative方法就要登場(chǎng)了。
我一直用的版本,自己寫的:
var isNative = function(method){//判定是否為原生方法
return !! method && (/\{\s*\[native code\]\s*\}/.test(method+"") ||
/\{\s*\/\* source code not available \*\/\s*\}/.test(method+""));//這里是為了兼容opera9.x的
}
但世界這么大,肯定也有研究過(guò)這問(wèn)題,下面是Diego Perini的版本,指出safari對(duì)原生方法的toString值其實(shí)也是個(gè)不合群的:
var isNative = function(object, method) {
return object && method in object &&
typeof object[method] != 'string' &&
// IE & W3C browser return "[native code]"
// Safari < = 2.0.4 will return "[function]"
(/\{\s*\[native code\]\s*\}|^\[function\]$/).test(object[method]);
}
它比我的版本多一個(gè)參數(shù),能指定是那個(gè)原生對(duì)象的方法,但一個(gè)參數(shù)與兩個(gè)參數(shù)是沒(méi)關(guān)系的,結(jié)果只是表明,我們倆離完美還有段距離。即使這兩個(gè)函數(shù)取并集,可能還不是正確的全集。
當(dāng)然這不是[native code]或者 source code not available還是[function]的問(wèn)題,因?yàn)橐猨avascript中,很容易山寨各種方法與對(duì)象。如,下面的代碼就可以成功騙過(guò)檢測(cè)代碼。
window.test = {
toString: function() {
return '[function]';
}
};
isNative(window, 'test'); // true
最后我從nwmathers中找到這個(gè):
var isNative = (function() {
var s = (window.open + '').replace(/open/g, '');
return function(object, method) {
var m = object ? object[method] : false, r = new RegExp(method, 'g');
return !!(m && typeof m != 'string' && s === (m + '').replace(r, ''));
};
})();
相關(guān)文章
js+for循環(huán)實(shí)現(xiàn)字符串自動(dòng)轉(zhuǎn)義的代碼(把后面的字符替換前面的字符)
這段代碼是從網(wǎng)上看到的一段不錯(cuò)的代碼,用for命令實(shí)現(xiàn)字符串的轉(zhuǎn)移,而且使用的是for循環(huán)直接將后面的字符替換成前面的字符,這個(gè)邏輯以前沒(méi)試過(guò)2020-12-12layui結(jié)合form,table的全選、反選v1.0示例講解
今天小編就為大家分享一篇layui結(jié)合form,table的全選、反選v1.0示例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-08-08JavaScript 判斷數(shù)據(jù)類型的4種方法
這篇文章主要介紹了JavaScript 判斷數(shù)據(jù)類型的4種方法,幫助大家更好的理解和學(xué)習(xí)JavaScript,感興趣的朋友可以了解下2020-09-09使用ionic在首頁(yè)新聞中應(yīng)用到的跑馬燈效果的實(shí)現(xiàn)方法
在app中經(jīng)常會(huì)有滾動(dòng)的跑馬燈效果的運(yùn)用,接下來(lái)通過(guò)本文給大家介紹使用ionic在首頁(yè)新聞中應(yīng)用到的跑馬燈效果的實(shí)現(xiàn)方法,需要的的朋友參考下2017-02-02javascript 閃爍的圣誕樹實(shí)現(xiàn)代碼
用js實(shí)現(xiàn)非常漂亮的帶閃爍效果的圣誕樹代碼。很佩服作者的想法。效果如下圖。2009-12-12JavaScript 嚴(yán)格模式(use strict)用法實(shí)例分析
這篇文章主要介紹了JavaScript 嚴(yán)格模式(use strict)用法,結(jié)合實(shí)例形式分析了JavaScript 嚴(yán)格模式的基本功能、用法及操作注意事項(xiàng),需要的朋友可以參考下2020-03-03JavaScript簡(jiǎn)單實(shí)現(xiàn)合并兩個(gè)Json對(duì)象的方法示例
這篇文章主要介紹了JavaScript簡(jiǎn)單實(shí)現(xiàn)合并兩個(gè)Json對(duì)象的方法,結(jié)合實(shí)例形式分析了json對(duì)象的遍歷、添加實(shí)現(xiàn)合并的相關(guān)操作技巧,需要的朋友可以參考下2017-10-10微信小程序獲取地理位置及經(jīng)緯度授權(quán)代碼實(shí)例
這篇文章主要介紹了微信小程序獲取地理位置及經(jīng)緯度授權(quán)代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09