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 相关文章推荐
js检测客户端不是firefox则提示下载
Apr 07 Javascript
json简单介绍
Jun 10 Javascript
javascript显示选择目录对话框的代码
Nov 10 Javascript
js和as的稳定传值问题解决
Jul 14 Javascript
JavaScript:Div层拖动效果实例代码
Aug 06 Javascript
JavaScript中的console.profile()函数详细介绍
Dec 29 Javascript
原生javascript实现Tab选项卡切换功能
Jan 12 Javascript
JavaScript定时器实现的原理分析
Dec 06 Javascript
jQuery异步提交表单实例
May 30 jQuery
这15个Vue指令,让你的项目开发爽到爆
Oct 11 Javascript
Javascript Worker子线程代码实例
Feb 20 Javascript
vue 自定义组件添加原生事件
Apr 21 Vue.js
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中操作Excel实例代码
2010/04/29 PHP
PHP Session_Regenerate_ID函数双释放内存破坏漏洞
2011/01/27 PHP
Laravel 中使用简单的方法跟踪用户是否在线(推荐)
2019/10/30 PHP
jquery form表单提交插件asp.net后台中文解码
2010/06/12 Javascript
Jquery练习之表单验证实现代码
2010/12/14 Javascript
jQuery插件jQuery-JSONP开发ajax调用使用注意事项
2013/11/22 Javascript
js打开windows上的可执行文件示例
2014/05/27 Javascript
JavaScript显示当前文档最后修改日期的方法
2015/03/19 Javascript
JavaScript暂停和继续定时器的实现方法
2016/07/18 Javascript
利用React Router4实现的服务端直出渲染(SSR)
2019/01/07 Javascript
ES6使用新特性Proxy实现的数据绑定功能实例
2020/05/11 Javascript
element中table高度自适应的实现
2020/10/21 Javascript
[00:34]TI7不朽珍藏III——纯金地穴编织者饰品展示
2017/07/15 DOTA
[59:00]OG vs TNC 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
[01:03:27]NAVI vs EG 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
利用python实现xml与数据库读取转换的方法
2017/06/17 Python
Python调用微信公众平台接口操作示例
2017/07/08 Python
今天 平安夜 Python 送你一顶圣诞帽 @微信官方
2017/12/25 Python
基于python历史天气采集的分析
2019/02/14 Python
Pandas-Cookbook 时间戳处理方式
2019/12/07 Python
Python数组并集交集补集代码实例
2020/02/18 Python
pytorch cuda上tensor的定义 以及减少cpu的操作详解
2020/06/23 Python
M1芯片安装python3.9.1的实现
2021/02/02 Python
分布式数据库需要考虑哪些问题
2013/12/08 面试题
物业门卫岗位职责
2013/12/28 职场文书
大学学习生活感言
2014/01/18 职场文书
测绘专业大学生职业生涯规划书
2014/02/10 职场文书
企业年度评优方案
2014/06/02 职场文书
社区志愿者活动方案
2014/08/18 职场文书
民主评议党员总结
2014/10/20 职场文书
民主评议党员个人总结
2015/02/13 职场文书
借款民事起诉状范文
2015/05/19 职场文书
网络研修随笔感言
2015/11/18 职场文书
温馨祝福晨语:美丽的一天从我的问候开始
2019/11/28 职场文书
javascript的var与let,const之间的区别详解
2022/02/18 Javascript
python神经网络 使用Keras构建RNN训练
2022/05/04 Python