JS判定是否原生方法


Posted in Javascript onJuly 22, 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 22 Javascript
jQuery学习笔记之jQuery.fn.init()的参数分析
Jun 09 Javascript
JS数组的遍历方式for循环与for...in
Jul 31 Javascript
更快的异步执行(setTimeout多浏览器)
Aug 12 Javascript
javascript实现列表滚动的方法
Jul 30 Javascript
JavaScript+html5 canvas绘制的圆弧荡秋千效果完整实例
Jan 26 Javascript
JavaScript+html5 canvas实现本地截图教程
Apr 16 Javascript
基于javascript实现按圆形排列DIV元素(二)
Dec 02 Javascript
vue组件Prop传递数据的实现示例
Aug 17 Javascript
原生JS实现动态加载js文件并在加载成功后执行回调函数的方法
Dec 30 Javascript
element UI upload组件上传附件格式限制方法
Sep 04 Javascript
使用vuepress搭建静态博客的示例代码
Feb 14 Javascript
js图片延迟加载的实现方法及思路
Jul 22 #Javascript
js添加table的行和列 具体实现方法
Jul 22 #Javascript
JS中eval函数的使用示例
Jul 21 #Javascript
JS中prototype关键字的功能介绍及使用示例
Jul 21 #Javascript
原生JS实现表单checkbook获取已选择的值
Jul 21 #Javascript
jquery animate实现鼠标放上去显示离开隐藏效果
Jul 21 #Javascript
jquery封装的对话框简单实现
Jul 21 #Javascript
You might like
Zend Studio 无法启动的问题解决方法
2008/12/04 PHP
php session处理的定制
2009/03/16 PHP
php下图片文字混合水印与缩略图实现代码
2009/12/11 PHP
PHP判断变量是否为0的方法
2014/02/08 PHP
ThinkPHP快速入门实例教程之数据分页
2014/07/01 PHP
php中10个不同等级压缩优化图片操作示例
2016/11/14 PHP
高性能web开发 如何加载JS,JS应该放在什么位置?
2010/05/14 Javascript
jquery ajax 调用失败的原因示例介绍
2013/09/27 Javascript
JS触发服务器控件的单击事件(详解)
2016/08/06 Javascript
总结AngularJS开发者最常犯的十个错误
2016/08/31 Javascript
详解用node-images 打造简易图片服务器
2017/05/08 Javascript
利用node.js如何搭建一个简易的即时响应服务器
2017/05/28 Javascript
使用JavaScript实现node.js中的path.join方法
2018/08/12 Javascript
浅谈微信JS-SDK 微信分享接口开发(介绍版)
2018/08/15 Javascript
PHPStorm中如何对nodejs项目进行单元测试详解
2019/02/28 NodeJs
js观察者模式的弹幕案例
2020/11/23 Javascript
python记录程序运行时间的三种方法
2017/07/14 Python
Django中间件实现拦截器的方法
2018/06/01 Python
pandas.cut具体使用总结
2019/06/24 Python
如何真正的了解python装饰器
2020/08/14 Python
Python Selenium自动化获取页面信息的方法
2020/08/31 Python
使用CSS3中的calc()属性来以算式表达尺寸数值
2016/06/06 HTML / CSS
法国娇韵诗官方旗舰店:Clarins是来自法国的天然护肤品牌
2018/06/30 全球购物
西班牙家用电器和电子产品购物网站:Mi Electro
2019/02/25 全球购物
德国网上超市:myTime.de
2019/08/26 全球购物
在C#中如何实现多态
2014/07/02 面试题
英语专业毕业生自荐信
2013/10/28 职场文书
优秀导游先进事迹材料
2014/01/25 职场文书
机关党员进社区活动总结
2014/07/05 职场文书
大学生学生会工作总结2015
2015/05/26 职场文书
少先队大队委竞选口号
2015/12/25 职场文书
如何用PHP实现多线程编程
2021/05/26 PHP
python库sklearn常用操作
2021/08/23 Python
Python Matplotlib库实现画局部图
2021/11/17 Python
详解jQuery的核心函数和事件处理
2022/02/18 jQuery
Python列表的索引与切片
2022/04/07 Python