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中利用数组实现的循环队列代码
Jan 24 Javascript
如何让div span等元素能响应键盘事件操作指南
Nov 13 Javascript
兼容ie、firefox的图片自动缩放的css跟js代码分享
Aug 12 Javascript
做web开发 先学JavaScript
Dec 12 Javascript
jquery特效 点击展示与隐藏全文
Dec 09 Javascript
js实现文字垂直滚动和鼠标悬停效果
Dec 31 Javascript
JavaScript事件学习小结(五)js中事件类型之鼠标事件
Jun 09 Javascript
Angular的MVC和作用域
Dec 26 Javascript
ES6正则表达式扩展笔记
Jul 25 Javascript
原生JS+Canvas实现五子棋游戏
May 28 Javascript
深入浅析Vue不同场景下组件间的数据交流
Aug 15 Javascript
js前端图片加载异常兜底方案
Jun 21 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生成二维码的两种方法(带logo图像)
2014/03/14 PHP
php筛选不存在的图片资源
2015/04/28 PHP
php简单判断文本编码的方法
2015/07/30 PHP
PHP入门教程之面向对象的特性分析(继承,多态,接口,抽象类,抽象方法等)
2016/09/11 PHP
PHP简单遍历对象示例
2016/09/28 PHP
php opendir()列出目录下所有文件的实例代码
2016/10/02 PHP
PHP利用Socket获取网站的SSL证书与公钥
2017/06/18 PHP
PHP封装的XML简单操作类完整实例
2017/11/13 PHP
javascript 嵌套的函数(作用域链)
2010/03/15 Javascript
JavaScript游戏之优化篇
2010/11/08 Javascript
JS 实现Table相同行的单元格自动合并示例代码
2013/08/27 Javascript
jQuery实现点击小图显示大图代码分享
2015/08/25 Javascript
js文字横向滚动特效
2015/11/11 Javascript
使用jquery.qrcode.min.js实现中文转化二维码
2016/03/11 Javascript
jQuery点击头像上传并预览图片
2017/02/23 Javascript
javascript数据结构之串的概念与用法分析
2017/04/12 Javascript
详解Vue中过度动画效果应用
2017/05/25 Javascript
nodejs接入阿里大鱼短信验证码的方法
2017/07/10 NodeJs
vue使用xe-utils函数库的具体方法
2018/03/06 Javascript
js console.log打印对象时属性缺失的解决方法
2019/05/23 Javascript
微信小程序scroll-view的滚动条设置实现
2020/03/02 Javascript
python发送邮件接收邮件示例分享
2014/01/21 Python
python如何实现远程控制电脑(结合微信)
2015/12/21 Python
Python实现KNN(K-近邻)算法的示例代码
2019/03/05 Python
用友笔试题目
2016/10/25 面试题
大学专科生推荐信范文
2013/11/23 职场文书
问卷调查计划书
2014/01/10 职场文书
旷课检讨书大全
2014/01/21 职场文书
庆八一活动方案
2014/01/25 职场文书
管事部库房保管员岗位职责
2014/02/21 职场文书
公安局副政委班子个人对照检查材料
2014/10/04 职场文书
夫妻双方自愿离婚协议书怎么写
2014/12/01 职场文书
惊天动地观后感
2015/06/10 职场文书
Python手拉手教你爬取贝壳房源数据的实战教程
2021/05/21 Python
CSS基础详解
2021/10/16 HTML / CSS
html中两种获取标签内的值的方法
2022/06/10 HTML / CSS