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 相关文章推荐
网页设计常用的一些技巧
Dec 22 Javascript
学习YUI.Ext 第四天--对话框Dialog的使用
Mar 10 Javascript
JavaScript极简入门教程(二):对象和函数
Oct 25 Javascript
jQuery中animate用法实例分析
Mar 09 Javascript
详解js中构造流程图的核心技术JsPlumb
Dec 08 Javascript
总结Javascript中的隐式类型转换
Aug 24 Javascript
深入了解JavaScript的逻辑运算符(与、或)
Dec 20 Javascript
javascript 中的继承实例详解
May 05 Javascript
BootStrap模态框和select2合用时input无法获取焦点的解决方法
Sep 01 Javascript
jQuery实现可兼容IE6的遮罩功能详解
Sep 19 jQuery
深入理解Vue router的部分高级用法
Aug 15 Javascript
原生js实现简单轮播图
Oct 26 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
php计算整个目录大小的方法
2015/06/19 PHP
PHP多维数组指定多字段排序的示例代码
2018/05/16 PHP
有关JavaScript的10个怪癖和秘密分享
2011/08/28 Javascript
javascript-表格排序(降序/反序)实现介绍(附图)
2013/05/30 Javascript
js修改原型的属性使用介绍
2014/01/26 Javascript
JS版的date函数(和PHP的date函数一样)
2014/05/12 Javascript
javascript使用call调用微信API
2014/12/15 Javascript
浅谈JavaScript的事件
2015/02/27 Javascript
Jquery插件实现点击获取验证码后60秒内禁止重新获取
2015/03/13 Javascript
基于jQuery实现照片墙自动播放特效
2017/01/12 Javascript
angular.extend方法的具体使用
2017/09/14 Javascript
详解vue-cli 本地开发mock数据使用方法
2018/05/29 Javascript
layui实现点击按钮给table添加一行
2018/08/10 Javascript
微信小程序实现消息框弹出动画
2020/04/18 Javascript
layui-table获得当前行的上/下一行数据的例子
2019/09/24 Javascript
layui下拉列表select实现可输入查找的方法
2019/09/28 Javascript
python连接mongodb操作数据示例(mongodb数据库配置类)
2013/12/31 Python
Python中用pycurl监控http响应时间脚本分享
2015/02/02 Python
浅谈python多线程和队列管理shell程序
2015/08/04 Python
Python Pandas找到缺失值的位置方法
2018/04/12 Python
解决Tensorflow安装成功,但在导入时报错的问题
2018/06/13 Python
对Tensorflow中权值和feature map的可视化详解
2018/06/14 Python
与Django结合利用模型对上传图片预测的实例详解
2019/08/07 Python
python对XML文件的操作实现代码
2020/03/27 Python
如何用python批量调整视频声音
2020/12/22 Python
纽约的奢华内衣店:Journelle
2016/07/29 全球购物
澳大利亚在线百货商店:Real Smart
2017/08/13 全球购物
Lentiamo荷兰:在线订购隐形眼镜、隐形眼镜液和太阳镜
2019/10/25 全球购物
2013年高中生自我评价
2013/10/23 职场文书
旷课检讨书大全
2014/01/21 职场文书
农民致富事迹材料
2014/01/23 职场文书
2014学习十八届四中全会精神思想汇报范文
2014/10/23 职场文书
领导欢迎词范文
2015/01/26 职场文书
经典《舰娘》游改全新动画预告 预定11月开播
2022/04/01 日漫
Mysql 文件配置解析介绍
2022/05/06 MySQL
Spring Boot实现文件上传下载
2022/08/14 Java/Android