判定是否原生方法的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学习笔记(二十) 获得和设置元素的特性(属性)
Jun 20 Javascript
fancybox modal的完美解决(右上的X)
Oct 30 Javascript
jquery特效 幻灯片效果示例代码
Jul 16 Javascript
在每个匹配元素的外部插入新元素的方法
Dec 20 Javascript
jQuery+CSS实现简单切换菜单示例
Jul 27 Javascript
微信小程序封装http访问网络库实例代码
May 24 Javascript
react-redux中connect的装饰器用法@connect详解
Jan 13 Javascript
对vue里函数的调用顺序介绍
Mar 17 Javascript
简述JS浏览器的三种弹窗
Jul 15 Javascript
详解Axios统一错误处理与后置
Sep 26 Javascript
解决layui使用layui-icon出现默认图标的问题
Sep 11 Javascript
JS实现横向轮播图(中级版)
Jan 18 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调用三种数据库的方法(1)
2006/10/09 PHP
谈谈关于php的优点与缺点
2013/04/11 PHP
php使用sql数据库 获取字段问题介绍
2013/08/12 PHP
twig模板常用语句实例小结
2016/02/04 PHP
PHP使用http_build_query()构造URL字符串的方法
2016/04/02 PHP
HTML中Select不用Disabled实现ReadOnly的效果
2008/04/07 Javascript
firefox下frameset取不到值的解决方法
2010/09/06 Javascript
extjs grid设置某列背景颜色和字体颜色的实现方法
2010/09/06 Javascript
jQuery timers计时器简单应用说明
2010/10/28 Javascript
extjs实现选择多表自定义查询功能 前台部分(ext源码)
2011/12/20 Javascript
JavaScript使用循环和分割来替换和删除元素实例
2014/10/13 Javascript
8 行 Node.js 代码实现代理服务器
2016/12/05 Javascript
Angularjs单选框相关的示例代码
2017/08/17 Javascript
React-Native左右联动List的示例代码
2017/09/21 Javascript
在Vue中使用Select选择器拼接label的操作
2020/10/22 Javascript
[04:48]DOTA2亚洲邀请赛林书豪为VGJ加油
2017/04/01 DOTA
如何使用python爬取csdn博客访问量
2016/02/14 Python
使用pygame模块编写贪吃蛇的实例讲解
2018/02/05 Python
python spyder中读取txt为图片的方法
2018/04/27 Python
python dataframe 输出结果整行显示的方法
2018/06/14 Python
python重试装饰器的简单实现方法
2019/01/31 Python
详解Python给照片换底色(蓝底换红底)
2019/03/22 Python
pyinstaller打包多个py文件和去除cmd黑框的方法
2019/06/21 Python
Python函数式编程实例详解
2020/01/17 Python
python实现录屏功能(亲测好用)
2020/03/02 Python
Python爬虫爬取ts碎片视频+验证码登录功能
2021/02/22 Python
可自定义箭头样式的CSS3气泡提示框
2016/03/16 HTML / CSS
html5小技巧之通过document.head获取head元素
2014/06/04 HTML / CSS
全球领先的全景影像品牌:Insta360
2019/08/21 全球购物
生产主管岗位职责
2013/11/10 职场文书
优秀党员获奖感言
2014/02/18 职场文书
公司活动方案范文
2014/03/06 职场文书
2014年电厂个人工作总结
2014/11/27 职场文书
《鸡兔同笼》教学反思
2016/02/19 职场文书
人生哲理妙语30条:淡写流年,笑过人生
2019/09/04 职场文书
Java实现超大Excel文件解析(XSSF,SXSSF,easyExcel)
2022/07/15 Java/Android