判定是否原生方法的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 相关文章推荐
YUI 读码日记之 YAHOO.util.Dom - Part.1
Mar 22 Javascript
JavaScript自定义日期格式化函数详细解析
Jan 14 Javascript
ExtJS 刷新后如何默认选中刷新前最后一次选中的节点
Apr 03 Javascript
node.js中的fs.unlink方法使用说明
Dec 15 Javascript
jQuery实现带水平滑杆的焦点图动画插件
Mar 08 Javascript
JavaScript对Json的增删改属性详解
Jun 02 Javascript
微信小程序(应用号)简单实例应用及实例详解
Sep 26 Javascript
原生js编写基于面向对象的分页组件
Dec 05 Javascript
a标签置灰不可点击的实现方法
Feb 06 Javascript
JavaScript Base64 作为文件上传的实例代码解析
Feb 14 Javascript
JavaScript校验Number(4,1)格式的数字实例代码
Mar 13 Javascript
介绍一下28个JS常用数组方法
May 06 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
克隆一个新项目的快捷方式
2013/04/10 PHP
ThinkPHP惯例配置文件详解
2014/07/14 PHP
PHP中new static()与new self()的区别异同分析
2014/08/22 PHP
CL vs ForZe BO5 第三场 2.13
2021/03/10 DOTA
jquery-easyui关闭tab自动切换到前一个tab
2010/07/29 Javascript
JavaScript词法作用域与调用对象深入理解
2012/11/29 Javascript
c#程序员对TypeScript的认识过程
2015/06/19 Javascript
javascript日期格式化方法小结
2015/12/17 Javascript
jQGrid动态填充select下拉框的选项值(动态填充)
2016/11/28 Javascript
javascript中的try catch异常捕获机制用法分析
2016/12/14 Javascript
简单实现js无缝滚动效果
2017/02/05 Javascript
SpringBoot+Vue前后端分离,使用SpringSecurity完美处理权限问题的解决方法
2018/01/09 Javascript
vue完成项目后,打包成静态文件的方法
2018/09/03 Javascript
用Fundebug插件记录网络请求异常的方法
2019/02/21 Javascript
jquery+ajax实现上传图片并显示上传进度功能【附php后台接收】
2019/06/06 jQuery
详解vue 命名视图
2019/08/14 Javascript
js实现全选和全不选
2020/07/28 Javascript
Python调用C/C++动态链接库的方法详解
2014/07/22 Python
Python中的Descriptor描述符学习教程
2016/06/02 Python
Python实现的根据文件名查找数据文件功能示例
2018/05/02 Python
Python通过调用有道翻译api实现翻译功能示例
2018/07/19 Python
基于python全局设置id 自动化测试元素定位过程解析
2019/09/04 Python
python中的线程threading.Thread()使用详解
2019/12/17 Python
OpenCV哈里斯(Harris)角点检测的实现
2020/01/15 Python
基于matplotlib中ion()和ioff()的使用详解
2020/06/16 Python
Python开发.exe小工具的详细步骤
2021/01/27 Python
Python3.9.1中使用split()的处理方法(推荐)
2021/02/07 Python
用CSS3将你的设计带入下个高度
2009/08/08 HTML / CSS
乌克兰最大的家用电器和电子产品连锁店:Eldorado
2019/10/02 全球购物
生物技术研究生自荐信
2013/11/12 职场文书
校园报刊亭的创业计划书
2014/01/02 职场文书
校园安全广播稿
2014/02/08 职场文书
家庭贫困证明书(3篇)
2014/09/15 职场文书
二手房购房协议书范本
2014/10/05 职场文书
语文教师个人工作总结
2015/02/06 职场文书
总结Python变量的相关知识
2021/06/28 Python