JS判定是否原生方法


Posted in Javascript onJuly 22, 2013

浏览器的趋势是加入越来越多对象,像Worker,同时也为旧有的对象添加新方法。如何兼容它的第一步就是检测它们是否存在,没有则补上自己的兼容代码。这时问题就来了,有的类库是给你做了这一步,但有时没有,有时是做了,但并不符合标准。因此单纯是typeof Array.prototype.map === "function"可能不够用。这时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值其实也是个不合群的:
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]);  
  }

它比我的版本多一个参数,能指定是那个原生对象的方法,但一个参数与两个参数是没关系的,结果只是表明,我们俩离完美还有段距离。即使这两个函数取并集,可能还不是正确的全集。
当然这不是[native code]或者 source code not available还是[function]的问题,因为要javascript中,很容易山寨各种方法与对象。如,下面的代码就可以成功骗过检测代码。
window.test = {  
  toString: function() {  
    return [function];  
  }  
}; 

isNative(window, test); // true
最后我从nwmathers中找到这个:
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, ));  
   };  
 })();
Javascript 相关文章推荐
Javascript图像处理—为矩阵添加常用方法
Dec 27 Javascript
ExtJS中文乱码之GBK格式编码解决方案及代码
Jan 20 Javascript
分享Javascript中最常用的55个经典小技巧
Nov 29 Javascript
jquery中change()用法实例分析
Feb 06 Javascript
在JavaScript中用getMinutes()方法返回指定的分时刻
Jun 10 Javascript
jquery实现带缩略图的全屏图片画廊效果实例
Jun 25 Javascript
浅谈javascript中的call、apply、bind
Mar 06 Javascript
基于React.js实现原生js拖拽效果引发的思考
Mar 30 Javascript
jQuery提示插件qTip2用法分析(支持ajax及多种样式)
Jun 08 Javascript
AngularJS实现的根据数量与单价计算总价功能示例
Dec 26 Javascript
Vue中Table组件Select的勾选和取消勾选事件详解
Mar 19 Javascript
JavaScript实现简单的图片切换功能(实例代码)
Apr 10 Javascript
js图片延迟加载的实现方法及思路
Jul 22 #Javascript
js添加table的行和列 具体实现方法
Jul 22 #Javascript
JS中eval函数的使用示例
Jul 21 #Javascript
JS中prototype关键字的功能介绍及使用示例
Jul 21 #Javascript
原生JS实现表单checkbook获取已选择的值
Jul 21 #Javascript
jquery animate实现鼠标放上去显示离开隐藏效果
Jul 21 #Javascript
jquery封装的对话框简单实现
Jul 21 #Javascript
You might like
php操作csv文件代码实例汇总
2014/09/22 PHP
thinkphp文件处理类Dir.class.php的用法分析
2014/12/08 PHP
php源码分析之DZX1.5加密解密函数authcode用法
2015/06/17 PHP
Yii2.0实现生成二维码功能实例
2017/10/24 PHP
如何让您的中波更粗更长 - 中波框形天线制作
2021/03/10 无线电
jQuery 各种浏览器下获得日期区别
2008/12/22 Javascript
jQuery DOM操作实例
2014/03/05 Javascript
javascript给span标签赋值的方法
2015/11/26 Javascript
JS实现的多张图片轮流播放幻灯片效果
2016/07/22 Javascript
Bootstrap选项卡学习笔记分享
2017/02/13 Javascript
基于vue实现多引擎搜索及关键字提示
2017/03/16 Javascript
在一般处理程序(ashx)中弹出js提示语
2017/08/16 Javascript
angularjs实现时间轴效果的示例代码
2017/11/29 Javascript
nodejs使用http模块发送get与post请求的方法示例
2018/01/08 NodeJs
vue弹窗消息组件的使用方法
2020/09/24 Javascript
vue项目中使用百度地图的方法
2018/06/08 Javascript
Vue.js子组件向父组件通信的方法实例代码详解
2018/12/10 Javascript
Node.js+Vue脚手架环境搭建的方法步骤
2020/03/08 Javascript
jQuery 函数实例分析【函数声明、函数表达式、匿名函数等】
2020/05/19 jQuery
基于element-ui封装表单金额输入框的方法示例
2021/01/06 Javascript
python控制台中实现进度条功能
2015/11/10 Python
Python随机生成带特殊字符的密码
2016/03/02 Python
python机器学习理论与实战(六)支持向量机
2018/01/19 Python
python构建深度神经网络(续)
2018/03/10 Python
Python查找两个有序列表中位数的方法【基于归并算法】
2018/04/20 Python
python石头剪刀布小游戏(三局两胜制)
2021/01/20 Python
PyCharm 无法 import pandas 程序卡住的解决方式
2020/03/09 Python
在django项目中导出数据到excel文件并实现下载的功能
2020/03/13 Python
Python selenium自动化测试模型图解
2020/04/15 Python
聊聊python在linux下与windows下导入模块的区别说明
2021/03/03 Python
纯CSS3实现带动画效果导航菜单无需js
2013/09/27 HTML / CSS
CSS3 transforms应用于背景图像的解决方法
2019/04/16 HTML / CSS
HTML5 拖放功能实现代码
2016/07/14 HTML / CSS
html2canvas把div保存图片高清图的方法示例
2018/03/05 HTML / CSS
户籍证明的格式
2014/01/13 职场文书
公司股份合作协议书
2014/12/07 职场文书