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 相关文章推荐
innerHTML,outerHTML,innerTEXT三者之间的区别
Jan 28 Javascript
jQuery live
May 15 Javascript
js 实现无干扰阴影效果 简单好用(附文件下载)
Dec 27 Javascript
js 实现 input type=&quot;file&quot; 文件上传示例代码
Aug 07 Javascript
vue实现列表的添加点击
Dec 29 Javascript
SelectPage v2.4 发布新增纯下拉列表和关闭分页功能
Sep 07 Javascript
微信小程序wx.uploadfile 本地文件转base64的实现代码
Jun 28 Javascript
element ui table(表格)实现点击一行展开功能
Dec 04 Javascript
vue获取验证码倒计时组件
Aug 26 Javascript
小程序实现按下录音松开识别语音
Nov 22 Javascript
vue实现鼠标移过出现下拉二级菜单功能
Dec 12 Javascript
如何让vue长列表快速加载
Mar 29 Vue.js
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
基于curl数据采集之单页面并行采集函数get_htmls的使用
2013/04/28 PHP
深入解析Session是否必须依赖Cookie
2013/08/02 PHP
PHP进行批量任务处理不超时的解决方法
2016/07/11 PHP
PHP实现基于状态的责任链审批模式详解
2019/05/31 PHP
js右键菜单效果代码
2007/07/21 Javascript
自己的js工具 Event封装
2009/08/21 Javascript
一个封装js代码-----展开收起效果示例
2013/07/03 Javascript
JS实现遮罩层效果的简单实例
2013/11/12 Javascript
使用js完成节点的增删改复制等的操作
2014/01/02 Javascript
JS、jquery实现几分钟前、几小时前、几天前等时间差显示效果的代码实例分享
2014/04/11 Javascript
Node.js中JavaScript操作MySQL的常用方法整理
2016/03/01 Javascript
通过jquery-ui中的sortable来实现拖拽排序的简单实例
2016/05/24 Javascript
AngularJs实现分页功能不带省略号的代码
2016/05/30 Javascript
微信小程序开发图片拖拽实例详解
2017/05/05 Javascript
详解webpack+gulp实现自动构建部署
2017/06/29 Javascript
vue中多路由表头吸顶实现的几种布局方式
2019/04/12 Javascript
vue实现表单录入小案例
2019/09/27 Javascript
Vue父子传递实例讲解
2020/02/14 Javascript
Python正则表达式知识汇总
2017/09/22 Python
Python实现返回数组中第i小元素的方法示例
2017/12/04 Python
Python装饰器用法实例总结
2018/05/26 Python
Python for循环中的陷阱详解
2018/07/13 Python
使用python Fabric动态修改远程机器hosts的方法
2018/10/26 Python
python的继承知识点总结
2018/12/10 Python
python 检查是否为中文字符串的方法
2018/12/28 Python
HTML5 body设置自适应全屏
2020/05/07 HTML / CSS
阿迪达斯芬兰官方网站:adidas芬兰
2017/01/30 全球购物
荣耀俄罗斯官网:HONOR俄罗斯
2020/10/31 全球购物
请用用Java代码写一个堆栈
2012/01/26 面试题
积极分子思想汇报
2014/01/04 职场文书
年会活动策划方案
2014/01/23 职场文书
办公室综合文员岗位职责范本
2014/02/13 职场文书
主持词开场白
2014/03/17 职场文书
临床医师个人自我评价
2014/04/06 职场文书
校车安全责任书
2014/08/25 职场文书
长江七号观后感
2015/06/11 职场文书