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 相关文章推荐
Juqery Html(),append()等方法的Bug解决方法
Dec 13 Javascript
JavaScript实现N皇后问题算法谜题解答
Dec 29 Javascript
javascript中call和apply的用法示例分析
Apr 02 Javascript
JavaScript中继承用法实例分析
May 16 Javascript
js如何实现点击标签文字,文字在文本框出现
Aug 05 Javascript
jquery实现垂直和水平菜单导航栏
Aug 27 Javascript
bootstrap模态框示例代码分享
May 17 Javascript
详解Angular路由 ng-route和ui-router的区别
May 22 Javascript
JS实现的合并多个数组去重算法示例
Apr 11 Javascript
React中的render何时执行过程
Apr 13 Javascript
node微信开发之获取access_token+自定义菜单
Mar 17 Javascript
vue 导航内容设置选中状态样式的例子
Nov 01 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
dedecms采集中可以过滤多行代码的正则表达式
2007/03/17 PHP
一个php Mysql类 可以参考学习熟悉下
2009/06/21 PHP
php download.php实现代码 跳转到下载文件(response.redirect)
2009/08/26 PHP
php操作xml入门之xml标签的属性分析
2015/01/23 PHP
WordPress中给文章添加自定义字段及后台编辑功能区域
2015/12/19 PHP
php实现简单加入购物车功能
2017/03/07 PHP
PHP培训要多少钱
2017/06/06 PHP
PHP 传输会话curl函数的实例详解
2017/09/12 PHP
JS类的封装及实现代码
2009/12/02 Javascript
js中if语句的几种优化代码写法
2011/03/12 Javascript
基于jquery的图片轮播 tab切换组件
2012/07/19 Javascript
基于jQuery中对数组进行操作的方法
2013/04/16 Javascript
在Node.js中实现文件复制的方法和实例
2014/06/05 Javascript
jQuery实现对无序列表的排序功能(附demo源码下载)
2016/06/25 Javascript
JS鼠标滚动分页效果示例
2017/07/05 Javascript
nodejs实现解析xml字符串为对象的方法示例
2018/03/14 NodeJs
bing Map 在vue项目中的使用详解
2018/04/09 Javascript
vue mint-ui tabbar变组件使用
2018/05/04 Javascript
小白教程|一小时上手最流行的前端框架vue(推荐)
2019/04/10 Javascript
vue增加强缓存和版本号的实现方法
2019/05/01 Javascript
详解JS预解析原理
2020/06/16 Javascript
我所理解的JavaScript中的this指向
2020/09/04 Javascript
[01:38]DOTA2第二届亚洲邀请赛中国区预选赛出线战队晋级之路
2017/01/17 DOTA
Python使用ftplib实现简易FTP客户端的方法
2015/06/03 Python
python实现二叉查找树实例代码
2018/02/08 Python
python 读取数据库并绘图的实例
2019/12/03 Python
python多线程使用方法实例详解
2019/12/30 Python
Python如何读写字节数据
2020/08/05 Python
50个强大璀璨的CSS3/JS技术运用实例
2010/02/27 HTML / CSS
幼儿园门卫制度
2014/01/29 职场文书
出纳员岗位职责风险
2014/03/06 职场文书
行政经理岗位职责
2015/04/15 职场文书
2015年销售内勤工作总结
2015/04/27 职场文书
Nginx反爬虫策略,防止UA抓取网站
2021/03/31 Servers
Django集成富文本编辑器summernote的实现步骤
2021/05/31 Python
MongoDB日志切割的三种方式总结
2021/09/15 MongoDB