判定是否原生方法的JS代碼
瀏覽器的趨勢是加入越來越多對象,像Worker,同時(shí)也為舊有的對象添加新方法。如何兼容它的第一步就是檢測它們是否存在,沒有則補(bǔ)上自己的兼容代碼。這時(shí)問題就來了,有的類庫是給你做了這一步,但有時(shí)沒有,有時(shí)是做了,但并不符合標(biāo)準(zhǔn)。因此單純是typeof Array.prototype.map === "function"可能不夠用。這時(shí)isNative方法就要登場了。
我一直用的版本,自己寫的:
var isNative = function(method){//判定是否為原生方法
return !! method && (/\{\s*\[native code\]\s*\}/.test(method+"") ||
/\{\s*\/\* source code not available \*\/\s*\}/.test(method+""));//這里是為了兼容opera9.x的
}
但世界這么大,肯定也有研究過這問題,下面是Diego Perini的版本,指出safari對原生方法的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è)原生對象的方法,但一個(gè)參數(shù)與兩個(gè)參數(shù)是沒關(guān)系的,結(jié)果只是表明,我們倆離完美還有段距離。即使這兩個(gè)函數(shù)取并集,可能還不是正確的全集。
當(dāng)然這不是[native code]或者 source code not available還是[function]的問題,因?yàn)橐猨avascript中,很容易山寨各種方法與對象。如,下面的代碼就可以成功騙過檢測代碼。
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è)邏輯以前沒試過2020-12-12layui結(jié)合form,table的全選、反選v1.0示例講解
今天小編就為大家分享一篇layui結(jié)合form,table的全選、反選v1.0示例講解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-08-08JavaScript 判斷數(shù)據(jù)類型的4種方法
這篇文章主要介紹了JavaScript 判斷數(shù)據(jù)類型的4種方法,幫助大家更好的理解和學(xué)習(xí)JavaScript,感興趣的朋友可以了解下2020-09-09使用ionic在首頁新聞中應(yīng)用到的跑馬燈效果的實(shí)現(xiàn)方法
在app中經(jīng)常會(huì)有滾動(dòng)的跑馬燈效果的運(yùn)用,接下來通過本文給大家介紹使用ionic在首頁新聞中應(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簡單實(shí)現(xiàn)合并兩個(gè)Json對象的方法示例
這篇文章主要介紹了JavaScript簡單實(shí)現(xiàn)合并兩個(gè)Json對象的方法,結(jié)合實(shí)例形式分析了json對象的遍歷、添加實(shí)現(xiàn)合并的相關(guān)操作技巧,需要的朋友可以參考下2017-10-10微信小程序獲取地理位置及經(jīng)緯度授權(quán)代碼實(shí)例
這篇文章主要介紹了微信小程序獲取地理位置及經(jīng)緯度授權(quán)代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09