判定是否原生方法的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 兼容firefox的一些问题
May 21 Javascript
js 与或运算符 || &amp;&amp; 妙用
Dec 09 Javascript
Javascript 判断Flash是否加载完成的代码
Apr 12 Javascript
通过JS自动隐藏手机浏览器的地址栏实现原理与代码
Jan 02 Javascript
jQuery动态地获取系统时间实现代码
May 24 Javascript
JavaScript函数学习总结以及相关的编程习惯指南
Nov 16 Javascript
AngularJS ng-change 指令的详解及简单实例
Jul 30 Javascript
使用Angular CLI从蓝本生成代码详解
Mar 24 Javascript
JavaScript继承定义与用法实践分析
May 28 Javascript
JS实现求5的阶乘示例
Jan 21 Javascript
微信小程序 button样式设置为图片的方法
Jun 19 Javascript
vue axios请求成功却进入catch的原因分析
Sep 08 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
3
2006/10/09 PHP
简单的方法让你的后台登录更加安全(php中加session验证)
2012/08/22 PHP
smarty中js的调用方法示例
2014/10/27 PHP
php使用sql server验证连接数据库的方法
2014/12/25 PHP
php文件上传你必须知道的几点
2015/10/20 PHP
php代码检查代理ip的有效性
2016/08/19 PHP
php批量删除操作(数据访问)
2017/05/23 PHP
thinkphp ajaxfileupload实现异步上传图片的示例
2017/08/28 PHP
JavaScript 学习笔记二 字符串拼接
2010/03/28 Javascript
利用ajaxfileupload插件实现文件上传无刷新的具体方法
2013/06/08 Javascript
jQuery常用操作方法及常用函数总结
2014/06/19 Javascript
JavaScript中的数组操作介绍
2014/12/30 Javascript
JS中改变this指向的方法(call和apply、bind)
2016/03/26 Javascript
AngularJS $injector 依赖注入详解
2016/09/14 Javascript
JS实现双击内容变为可编辑状态
2017/03/03 Javascript
原生JS实现 MUI导航栏透明渐变效果
2017/11/07 Javascript
layui 优化button按钮和弹出框的方法
2018/08/15 Javascript
微信小程序吸底区域适配iPhoneX的实现
2020/04/09 Javascript
不依任何赖第三方,单纯用vue实现Tree 树形控件的案例
2020/09/21 Javascript
[00:20]DOTA2荣耀之路7:-ah fu-抢盾
2018/05/31 DOTA
Python爬虫设置代理IP的方法(爬虫技巧)
2018/03/04 Python
Python实现的生产者、消费者问题完整实例
2018/05/30 Python
Python通过递归获取目录下指定文件代码实例
2019/11/07 Python
pyinstaller打包成无控制台程序时运行出错(与popen冲突的解决方法)
2020/04/15 Python
python如何写个俄罗斯方块
2020/11/06 Python
python Scrapy框架原理解析
2021/01/04 Python
使用HTML5 Canvas API中的clip()方法裁剪区域图像
2016/03/25 HTML / CSS
html5实现完美兼容各大浏览器的播放器
2014/12/26 HTML / CSS
AmazeUI 缩略图的实现示例
2020/08/18 HTML / CSS
韩国保养品、日本药妆购物网:小三美日
2018/12/30 全球购物
CSS实现fullpage.js全屏滚动效果的示例代码
2021/03/24 HTML / CSS
商场主管竞聘书
2014/03/31 职场文书
党支部对转正的意见
2015/06/02 职场文书
百日宴上的祝酒词
2015/08/10 职场文书
PostgreSQL存储过程实用脚本(二):创建函数入门
2021/04/05 PostgreSQL
windows系统搭建WEB服务器详细教程
2022/08/05 Servers