判定是否原生方法的JS代码


Posted in Javascript onNovember 12, 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 相关文章推荐
jQuery 表单验证扩展(四)
Oct 20 Javascript
减少访问DOM的次数提升javascript性能
Feb 24 Javascript
jquery 获取 outerHtml 包含当前节点本身的代码
Oct 30 Javascript
jQuery制作可自定义大小的拼图游戏
Mar 30 Javascript
js电话号码验证方法
Sep 28 Javascript
vue-dialog的弹出层组件
May 25 Javascript
浅谈原生JS实现jQuery的animate()动画示例
Mar 08 Javascript
解决vue多个路由共用一个页面的问题
Mar 12 Javascript
Angular5集成eventbus的示例代码
Jul 19 Javascript
Vue中的v-for循环key属性注意事项小结
Aug 12 Javascript
在element-ui的el-tree组件中用render函数生成el-button的实例代码
Nov 05 Javascript
vue3中provide && inject的使用
Jul 01 Vue.js
给文字加上着重号的JS代码
Nov 12 #Javascript
深入理解javascript动态插入技术
Nov 12 #Javascript
在ASP.NET中使用JavaScript脚本的方法
Nov 12 #Javascript
JS常用正则表达式总结
Nov 12 #Javascript
jquery 删除cookie失效的解决方法
Nov 12 #Javascript
IE下window.onresize 多次调用与死循环bug处理方法介绍
Nov 12 #Javascript
JS获取键盘上任意按键的值(实例代码)
Nov 12 #Javascript
You might like
关于使用key/value数据库redis和TTSERVER的心得体会
2013/06/28 PHP
php数组合并array_merge()函数使用注意事项
2014/06/19 PHP
Laravel如何同时连接多个数据库详解
2019/08/13 PHP
srcElement表格样式
2006/09/03 Javascript
IE6 弹出Iframe层中的文本框“经常”无法获得输入焦点
2009/12/27 Javascript
基于Jquery的$.cookie()实现跨越页面tabs导航实现代码
2011/03/03 Javascript
提高javascript效率 一次判断,而不要次次判断
2012/03/30 Javascript
解决火狐浏览器下JS setTimeout函数不兼容失效不执行的方法
2012/11/14 Javascript
js获取某元素的class里面的css属性值代码
2014/01/16 Javascript
jQuery实现指定内容滚动同时左侧或其它地方不滚动的方法
2015/08/08 Javascript
BootStrap智能表单实战系列(九)表单图片上传的支持
2016/06/13 Javascript
AngularJS入门教程之迭代器过滤详解
2016/08/18 Javascript
Vue.js中数组变动的检测详解
2016/10/12 Javascript
livereload工具实现前端可视化开发【推荐】
2016/12/23 Javascript
详解Jquery 遍历数组之$().each方法与$.each()方法介绍
2017/01/09 Javascript
angular6.x中ngTemplateOutlet指令的使用示例
2018/08/09 Javascript
如何去除富文本中的html标签及vue、react、微信小程序中的过滤器
2018/11/21 Javascript
详解Vue、element-ui、axios实现省市区三级联动
2019/05/07 Javascript
BootstrapValidator实现表单验证功能
2019/11/08 Javascript
Node.js 在本地生成日志文件的方法
2020/02/07 Javascript
TF-IDF与余弦相似性的应用(一) 自动提取关键词
2017/12/21 Python
Python爬虫番外篇之Cookie和Session详解
2017/12/27 Python
python中import与from方法总结(推荐)
2019/03/21 Python
python如何制作英文字典
2019/06/25 Python
Python3.7将普通图片(png)转换为SVG图片格式(网站logo图标)动起来
2020/04/21 Python
俄罗斯有趣和原创礼物网上商店:MagicMag
2019/08/01 全球购物
PHP笔试题
2012/02/22 面试题
自我鉴定书面格式
2014/01/13 职场文书
婚纱摄影师求职信
2014/03/07 职场文书
对外汉语专业大学生职业生涯规划书
2014/10/11 职场文书
民政局离婚协议书范本
2014/10/20 职场文书
学院党委班子四风问题自查报告及整改措施
2014/10/25 职场文书
教师个人师德总结
2015/02/06 职场文书
教师求职自荐信范文
2015/03/04 职场文书
Ajax是什么?Ajax高级用法之Axios技术
2021/04/21 Javascript
在K8s上部署Redis集群的方法步骤
2021/04/27 Redis