判定是否原生方法的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 相关文章推荐
Javascript实现的鼠标经过时播放声音
May 18 Javascript
JavaScript入门之事件、cookie、定时等
Oct 21 Javascript
理解Javascript的动态语言特性
Jun 17 Javascript
jQuery实现的Div窗口震动效果实例
Aug 07 Javascript
使用jquery+CSS3实现仿windows10开始菜单的下拉导航菜单特效
Sep 24 Javascript
js显示当前日期时间和星期几
Oct 22 Javascript
jQuery点击其他地方时菜单消失的实现方法
Apr 22 Javascript
AngularJs篇:使用AngularJs打造一个简易权限系统的实现代码
Dec 26 Javascript
JS实现队列的先进先出功能示例
May 10 Javascript
JavaScript 点击触发复制功能实例详解
Nov 02 Javascript
使用Vue-cli3.0创建的项目 如何发布npm包
Oct 10 Javascript
详细分析vue响应式原理
Jun 22 Javascript
给文字加上着重号的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
php mysql 判断update之后是否更新了的方法
2012/01/10 PHP
PHP数据流应用的一个简单实例
2012/09/14 PHP
php导出生成word的方法
2015/12/25 PHP
javascript实现轮显新闻标题链接
2007/08/13 Javascript
AngularJS基础知识笔记之表格
2015/05/10 Javascript
基于jQuery通过jQuery.form.js插件使用ajax提交form表单
2015/08/17 Javascript
Bootstrap3制作图片轮播效果
2016/05/12 Javascript
js实现一个可以兼容PC端和移动端的div拖动效果实例
2016/12/09 Javascript
详解jQuery事件
2017/01/13 Javascript
浅谈React Native Flexbox布局(小结)
2018/01/08 Javascript
vue2.0 如何在hash模式下实现微信分享
2019/01/22 Javascript
node 版本切换的实现
2020/02/02 Javascript
在vue中封装的弹窗组件使用队列模式实现方法
2020/07/23 Javascript
Python中用Descriptor实现类级属性(Property)详解
2014/09/18 Python
Python设计模式之迭代器模式原理与用法实例分析
2019/01/10 Python
Python写一个基于MD5的文件监听程序
2019/03/11 Python
python实现爬山算法的思路详解
2019/04/09 Python
python 将字符串中的数字相加求和的实现
2019/07/18 Python
Django实现文件上传和下载功能
2019/10/06 Python
解决pyecharts运行后产生的html文件用浏览器打开空白
2020/03/11 Python
使用python实现时间序列白噪声检验方式
2020/06/03 Python
python如何求圆的面积
2020/07/01 Python
python 如何设置守护进程
2020/10/29 Python
弄清Pytorch显存的分配机制
2020/12/10 Python
css3 仿写阿里云水纹效果的示例代码
2018/02/10 HTML / CSS
阿里健康官方海外旗舰店:阿里健康国际自营
2017/11/24 全球购物
英国最受欢迎的价格比较网站之一:MoneySuperMarket
2018/12/19 全球购物
在加拿大在线租赁和购买电子游戏:Game Access
2019/09/02 全球购物
薇姿法国官网:Vichy法国
2021/01/28 全球购物
区域总监的岗位职责
2013/11/21 职场文书
护士个人自我鉴定
2014/03/24 职场文书
理发店策划方案
2014/06/05 职场文书
民警个人对照检查剖析材料
2014/09/17 职场文书
2014个人年度工作总结
2014/12/15 职场文书
关于vue中如何监听数组变化
2021/04/28 Vue.js
golang使用map实现去除重复数组
2022/04/14 Golang