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 实现复制到粘贴板的功能代码
May 13 Javascript
js 三级关联菜单效果实例
Aug 13 Javascript
经过绑定元素时会多次触发mouseover和mouseout事件
Feb 28 Javascript
js简单判断移动端系统的方法
Feb 25 Javascript
js和C# 时间日期格式转换的简单实例
May 28 Javascript
Highcharts学习之坐标轴
Aug 02 Javascript
微信小程序 实例开发总结
Apr 26 Javascript
浅谈JS如何实现真正的对象常量
Jun 25 Javascript
Three.js实现浏览器变动时进行自适应的方法
Sep 26 Javascript
微信小程序实现多选功能
Nov 04 Javascript
如何在vue里面优雅的解决跨域(路由冲突问题)
Jan 20 Javascript
vue学习之Vue-Router用法实例分析
Jan 06 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学习的路线图
2013/07/10 PHP
php 无限级分类,超级简单的无限级分类,支持输出树状图
2014/06/29 PHP
深入理解PHP中的global
2014/08/19 PHP
PHP处理postfix邮件内容的方法
2015/06/16 PHP
如何使用php脚本给html中引用的js和css路径打上版本号
2015/11/18 PHP
基于CI框架的微信网页授权库示例
2016/11/25 PHP
laravel框架使用极光推送消息操作示例
2020/02/15 PHP
使用JS进行目录上传(相当于批量上传)
2010/12/05 Javascript
jquery实现倒计时代码分享
2014/06/13 Javascript
javascript设置连续两次点击按钮时间间隔的方法
2014/10/28 Javascript
Google 地图API Map()构造器详解
2016/08/06 Javascript
原生js封装的一些jquery方法(详解)
2016/09/20 Javascript
常用的js方法合集
2017/03/10 Javascript
JS实现线性表的顺序表示方法示例【经典数据结构】
2017/04/11 Javascript
用js实现每隔一秒刷新时间的实例(含年月日时分秒)
2017/10/25 Javascript
Node中使用ES6语法的基础教程
2018/01/05 Javascript
vue filters的使用详解
2018/06/11 Javascript
微信小程序实现元素渐入渐出动画效果封装方法
2019/05/18 Javascript
vue router 传参获取不到的解决方式
2019/11/13 Javascript
Vue包大小优化的实现(从1.72M到94K)
2021/02/18 Vue.js
[46:37]LGD vs TNC 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
python不带重复的全排列代码
2013/08/13 Python
Java中重定向输出流实现用文件记录程序日志
2015/06/12 Python
python元组和字典的内建函数实例详解
2019/10/22 Python
python函数调用,循环,列表复制实例
2020/05/03 Python
keras 自定义loss损失函数,sample在loss上的加权和metric详解
2020/05/23 Python
python爬虫scrapy框架之增量式爬虫的示例代码
2021/02/26 Python
CSS3 真的会替代 SCSS 吗
2021/03/09 HTML / CSS
涂鸦板简单实现 Html5编写属于自己的画画板
2016/07/05 HTML / CSS
餐饮服务食品安全责任书
2014/07/25 职场文书
施工安全协议书范本
2014/09/26 职场文书
golang协程池模拟实现群发邮件功能
2021/05/02 Golang
python接口测试返回数据为字典取值方式
2022/02/12 Python
SONY AN-LP1 短波有源天线放大器图
2022/04/05 无线电
电脑关机速度很慢怎么办 提升电脑关机速度设置教程
2022/04/08 数码科技
nginx lua 操作 mysql
2022/05/15 Servers