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 相关文章推荐
javascript 命名规则 变量命名规则
Feb 25 Javascript
javaScript使用EL表达式的几种方式
May 27 Javascript
js解决select下拉选不中问题
Oct 14 Javascript
jQuery实现手机号码输入提示功能实例
Apr 30 Javascript
属于你的jQuery提示框(Tip)插件
Jan 20 Javascript
jQuery基于ajax操作json数据简单示例
Jan 05 Javascript
jQuery实现IE输入框完成placeholder标签功能的方法
Sep 20 jQuery
关于Vue Router中路由守卫的应用及在全局导航守卫中检查元字段的方法
Dec 09 Javascript
原生JS检测CSS3动画是否结束的方法详解
Jan 27 Javascript
在Vue中用canvas实现二维码和图片合成海报的方法
Jun 10 Javascript
详细分析React 表单与事件
Jul 08 Javascript
使用node-media-server搭建一个简易的流媒体服务器
Jan 20 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
《魔兽争霸3》重制版究竟重制了什么?玩家:这么糊弄真的好吗?
2020/05/04 魔兽争霸
php登陆页的密码处理方式分享
2013/10/14 PHP
Laravel 修改默认日志文件名称和位置的例子
2019/10/17 PHP
JS面向对象、prototype、call()、apply()
2009/05/14 Javascript
整理一些JavaScript的IE和火狐的兼容性注意事项
2011/03/17 Javascript
javascript学习笔记(三)显示当时时间的代码
2011/04/08 Javascript
eval的两组性能测试数据
2012/08/17 Javascript
jquery模拟SELECT下拉框取值效果
2013/10/23 Javascript
IE与FF下javascript获取网页及窗口大小的区别详解
2014/01/14 Javascript
在javascript中如何得到中英文混合字符串的长度
2014/01/17 Javascript
js实现checkbox全选、不选与反选的方法
2015/02/09 Javascript
jQuery幻灯片特效代码分享--鼠标滑过按钮时切换(2)
2020/11/18 Javascript
Node.js 应用跑得更快 10 个技巧
2016/04/03 Javascript
jQuery插件 Jqplot图表实例
2016/06/18 Javascript
js对象浅拷贝和深拷贝详解
2016/09/05 Javascript
json定义及jquery操作json的方法
2016/10/03 Javascript
Javascript 高性能之递归,迭代,查表法详解及实例
2017/01/08 Javascript
angular5 httpclient的示例实战
2018/03/12 Javascript
Vue.js中 v-model 指令的修饰符详解
2018/12/03 Javascript
angular8和ngrx8结合使用的步骤介绍
2019/12/01 Javascript
javascript使用Blob对象实现的下载文件操作示例
2020/04/18 Javascript
使用C语言来扩展Python程序和Zope服务器的教程
2015/04/14 Python
python实现用户登陆邮件通知的方法
2015/07/09 Python
Python学习小技巧之列表项的推导式与过滤操作
2017/05/20 Python
78行Python代码实现现微信撤回消息功能
2018/07/26 Python
浅谈Python爬虫基本套路
2019/03/25 Python
Python 的AES加密与解密实现
2019/07/09 Python
Python 字典中的所有方法及用法
2020/06/10 Python
工商管理自荐书
2014/07/06 职场文书
教师党员自我评价范文
2015/03/04 职场文书
化妆品促销活动总结
2015/05/07 职场文书
迁徙的鸟观后感
2015/06/09 职场文书
教师工作证明范本
2015/06/12 职场文书
药房管理制度范本
2015/08/06 职场文书
mysql 数据插入优化方法之concurrent_insert
2021/07/01 MySQL
JavaScript组合继承详解
2021/11/07 Javascript