熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> JSP教程 >> 正文

JS判定是否原生方法

2022-06-13   來源: JSP教程 
這篇文章介紹了js判定是否原生方法有需要的朋友可以參考一下  

  浏覽器的趨勢是加入越來越多對象像Worker同時也為舊有的對象添加新方法如何兼容它的第一步就是檢測它們是否存在沒有則補上自己的兼容代碼 這時問題就來了有的類庫是給你做了這一步但有時沒有有時是做了但並不符合標准因此單純是typeof Arrayprototypemap === "function"可能不夠用這時isNative方法就要登場了
我一直用的版本自己寫的

復制代碼 代碼如下:
var isNative = function(method){//判定是否為原生方法 
      return !! method && (/{s*[native code]s*}/test(method+"") || 
          /{s*/* source code not available */s*}/test(method+""));//這裡是為了兼容operax的 
  }

  
但世界這麼大肯定也有研究過這問題下面是Diego Perini的版本指出safari對原生方法的toString值其實也是個不合群的

復制代碼 代碼如下:
var isNative = function(object method) { 
    return object && method in object && 
      typeof object[method] != string && 
      // IE & WC browser return "[native code]" 
      // Safari < = will return "[function]" 
      (/{s*[native code]s*}|^[function]$/)test(object[method]); 
  }

  
它比我的版本多一個參數能指定是那個原生對象的方法但一個參數與兩個參數是沒關系的結果只是表明我們倆離完美還有段距離即使這兩個函數取並集可能還不是正確的全集
當然這不是[native code]或者 source code not available還是[function]的問題因為要javascript中很容易山寨各種方法與對象下面的代碼就可以成功騙過檢測代碼

復制代碼 代碼如下:
windowtest = { 
  toString: function() { 
    return [function]; 
  } 
}; 

  
isNative(window test); // true
最後我從nwmathers中找到這個

復制代碼 代碼如下:

  
var isNative = (function() { 
   var s = (windowopen + )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 )); 
   }; 
 })();


From:http://tw.wingwit.com/Article/program/Java/JSP/201311/20194.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.