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 核心参考教程 内置对象
Oct 13 Javascript
js类式继承的具体实现方法
Dec 31 Javascript
jQuery+ajax实现动态执行脚本的方法
Jan 27 Javascript
JS实现的文字与图片定时切换效果代码
Oct 06 Javascript
vue-router 学习快速入门
Mar 01 Javascript
bootstrap table单元格新增行并编辑
May 19 Javascript
angular2 ng2 @input和@output理解及示例
Oct 10 Javascript
vue实例中data使用return包裹的方法
Aug 27 Javascript
基于vue的验证码组件的示例代码
Jan 22 Javascript
react native 仿微信聊天室实例代码
Sep 17 Javascript
微信小程序本地存储实现每日签到、连续签到功能
Oct 09 Javascript
Vue实例的对象参数options的几个常用选项详解
Nov 08 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
杏林同学录(二)
2006/10/09 PHP
刚才在简化php的库,结果发现很多东西
2006/12/31 PHP
PHP 图片文件上传实现代码
2010/12/29 PHP
mysql_num_rows VS COUNT 效率问题分析
2011/04/23 PHP
php中mkdir()函数的权限问题分析
2016/09/24 PHP
Extjs学习笔记之九 数据模型(上)
2010/01/11 Javascript
jQuery源码分析-02正则表达式 RegExp 常用正则表达式
2011/11/14 Javascript
JS合并数组的几种方法及优劣比较
2014/09/19 Javascript
node.js操作mongoDB数据库示例分享
2014/11/26 Javascript
jQuery中:submit选择器用法实例
2015/01/03 Javascript
Bootstrap表单组件教程详解
2016/04/26 Javascript
jQuery Dialog 打开时自动聚焦的解决方法(两种方法)
2016/11/24 Javascript
bootstrap PrintThis打印插件使用详解
2017/02/20 Javascript
jQuery中Chosen三级联动功能实例代码
2017/03/07 Javascript
使用jQuery实现动态添加小广告
2017/07/11 jQuery
jQuery仿移动端支付宝键盘的实现代码
2018/08/15 jQuery
JavaScript函数的特性与应用实践深入详解
2018/12/30 Javascript
JavaScript ES6箭头函数使用指南
2018/12/30 Javascript
微信小程序保存多张图片的实现方法
2019/03/05 Javascript
vue-cli 项目打包完成后运行文件路径报错问题
2019/07/19 Javascript
[52:20]VP vs VG Supermajor小组赛 B组胜者组决赛 BO3 第一场 6.2
2018/06/03 DOTA
Python3多线程爬虫实例讲解代码
2018/01/05 Python
Python获取二维矩阵每列最大值的方法
2018/04/03 Python
python对excel文档去重及求和的实例
2018/04/18 Python
python取数作为临时极大值(极小值)的方法
2018/10/15 Python
Python采集猫眼两万条数据 对《无名之辈》影评进行分析
2018/12/05 Python
pandas分批读取大数据集教程
2020/06/06 Python
Python 如何在字符串中插入变量
2020/08/01 Python
随机分配座位,共50个学生,使学号相邻的同学座位不能相邻
2014/01/18 面试题
shell程序中如何注释
2012/01/28 面试题
婚庆司仪主持词
2014/03/15 职场文书
祖国在我心中演讲稿300字
2014/05/04 职场文书
幼儿园安全责任书范本
2014/07/24 职场文书
普希金诗歌赏析(6首)
2019/08/22 职场文书
PHP命令行与定时任务
2021/04/01 PHP
Python爬取某拍短视频
2021/06/11 Python