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 相关文章推荐
js 加载时自动调整图片大小
May 28 Javascript
下载网站打开页面后间隔多少时间才显示下载链接地址的代码
Apr 25 Javascript
详解强大的jQuery选择器之基本选择器、层次选择器
Feb 07 Javascript
js中escape对应的C#解码函数 UrlDecode
Dec 16 Javascript
深入理解javaScript中的事件驱动
May 21 Javascript
event对象获取方法总结在google浏览器下测试
Nov 03 Javascript
jQuery找出网页上最高元素的方法
Mar 20 Javascript
一个简单不报错的summernote 图片上传案例
Jul 11 Javascript
深入探讨Vue.js组件和组件通信
Sep 12 Javascript
js实现微博发布小功能
Jan 12 Javascript
JavaScript实现前端分页控件
Apr 19 Javascript
基于vue-cli vue-router搭建底部导航栏移动前端项目
Feb 28 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下通过file_get_contents的代理使用方法
2011/02/16 PHP
一个PHP缓存类代码(附详细说明)
2011/06/09 PHP
php学习笔记 [预定义数组(超全局数组)]
2011/06/09 PHP
php继承中方法重载(覆盖)的应用场合
2015/02/09 PHP
PHP判断密码强度的方法详解
2017/05/26 PHP
PHP数据库操作三:redis用法分析
2017/08/16 PHP
PHP二维关联数组的遍历方式(实例讲解)
2017/10/18 PHP
Laravel第三方包报class not found的解决方法
2019/10/13 PHP
Javascript调试工具(下载)
2007/01/09 Javascript
xtree.js 代码
2007/03/13 Javascript
解决js正则匹配换行问题实现代码
2012/12/10 Javascript
jQuery中parentsUntil()方法用法实例
2015/01/07 Javascript
详解nodejs模板引擎制作
2017/06/14 NodeJs
React Native使用百度Echarts显示图表的示例代码
2017/11/07 Javascript
vue-scroller记录滚动位置的示例代码
2018/01/17 Javascript
js将当前时间格式化为 年-月-日 时:分:秒的实现代码
2018/01/20 Javascript
vue之浏览器存储方法封装实例
2018/03/15 Javascript
使用vue.js在页面内组件监听scroll事件的方法
2018/09/11 Javascript
JS使用数组实现的队列功能示例
2019/03/04 Javascript
微信小程序 行的删除和增加操作实现详解
2019/09/29 Javascript
Python栈算法的实现与简单应用示例
2017/11/01 Python
Python排序搜索基本算法之希尔排序实例分析
2017/12/09 Python
Tensorflow 自带可视化Tensorboard使用方法(附项目代码)
2018/02/10 Python
Python 25行代码实现的RSA算法详解
2018/04/10 Python
Window环境下Scrapy开发环境搭建
2018/11/18 Python
Python制作微信好友背景墙教程(附完整代码)
2019/07/17 Python
洲际酒店集团美国官网:IHG美国
2017/11/16 全球购物
香港最大的洋酒零售连锁店:屈臣氏酒窖(Watson’s Wine)
2018/12/10 全球购物
培训自我鉴定
2014/01/31 职场文书
八年级语文教学反思
2014/02/11 职场文书
建议书标准格式
2014/03/12 职场文书
三八妇女节超市活动方案
2014/08/18 职场文书
医院深入开展党的群众路线教育实践活动实施方案
2014/08/27 职场文书
2015新学期校长寄语(3篇)
2015/03/25 职场文书
第一节英语课开场白
2015/06/01 职场文书
分享7个 Python 实战项目练习
2022/03/03 Python