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 相关文章推荐
异步加载script的代码
Jan 12 Javascript
基于jquery的内容循环滚动小模块(仿新浪微博未登录首页滚动微博显示)
Mar 28 Javascript
让textarea自动调整大小的js代码
Apr 12 Javascript
基于jQuery+HttpHandler实现图片裁剪效果代码(适用于论坛, SNS)
Sep 02 Javascript
jQuery EasyUI API 中文文档 - ComboBox组合框
Oct 07 Javascript
调用jQuery滑出效果时闪烁的解决方法
Mar 27 Javascript
jQuery中attr()和prop()在修改checked属性时的区别
Jul 18 Javascript
jquery实现表格中点击相应行变色功能效果【实例代码】
May 09 Javascript
Node.js的Web模板引擎ejs的入门使用教程
Jun 06 Javascript
vue bootstrap小例子一枚
Jun 09 Javascript
vue-cli的build的文件夹下没有dev-server.js文件配置mock数据的方法
Apr 17 Javascript
vscode 配置vue+vetur+eslint+prettier自动格式化功能
Mar 23 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 array_merge下进行数组合并的代码
2008/07/22 PHP
php实现telnet功能示例
2014/04/08 PHP
yii操作session实例简介
2014/07/31 PHP
PHP FileSystem 文件系统常用api整理总结
2019/07/12 PHP
Jquery拖拽并简单保存的实现代码
2010/11/28 Javascript
浅谈JavaScript中定义变量时有无var声明的区别
2014/08/18 Javascript
jquery实现平滑的二级下拉菜单效果
2015/08/26 Javascript
nodejs实现bigpipe异步加载页面方案
2016/01/26 NodeJs
Bootstrap和Angularjs配合自制弹框的实例代码
2016/08/24 Javascript
原生js实现放大镜效果
2017/01/11 Javascript
JS百度地图搜索悬浮窗功能
2017/01/12 Javascript
jQuery日程管理控件glDatePicker用法详解
2017/03/29 jQuery
Bootstrap 模态框(Modal)带参数传值实例
2017/08/20 Javascript
js实现rem自动匹配计算font-size的示例
2017/11/18 Javascript
12条写出高质量JS代码的方法
2018/01/07 Javascript
JavaScript禁用右键单击优缺点分析
2019/01/20 Javascript
layui 数据表格复选框实现单选功能的例子
2019/09/19 Javascript
Node.js API详解之 module模块用法实例分析
2020/05/13 Javascript
vue使用video插件vue-video-player详解
2020/10/23 Javascript
Python+request+unittest实现接口测试框架集成实例
2018/03/16 Python
python leetcode 字符串相乘实例详解
2018/09/03 Python
Linux下python3.6.1环境配置教程
2018/09/26 Python
pycharm 将python文件打包为exe格式的方法
2019/01/16 Python
对Python3使运行暂停的方法详解
2019/02/18 Python
python实现批量nii文件转换为png图像
2019/07/18 Python
python实现的自动发送消息功能详解
2019/08/15 Python
一篇文章搞懂python的转义字符及用法
2020/09/03 Python
用html5实现语音搜索框的方法
2014/03/18 HTML / CSS
您的健身减肥和健康饮食专家:vitafy
2017/06/06 全球购物
Android面试题附答案
2014/12/08 面试题
主持人演讲稿范文
2013/12/28 职场文书
市场营销专业大学生职业生涯规划文
2014/03/06 职场文书
新农村建设汇报材料
2014/08/15 职场文书
2014年小学工作总结
2014/11/26 职场文书
建国大业电影观后感
2015/06/01 职场文书
可可西里观后感
2015/06/08 职场文书