判定是否原生方法的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 相关文章推荐
JavaScript中json对象和string对象之间相互转化
Dec 26 Javascript
js实现倒计时(距离结束还有)示例代码
Jul 24 Javascript
JavaScript中window、doucment、body的解释
Aug 14 Javascript
Javascript中arguments和arguments.callee的区别浅析
Apr 24 Javascript
如何判断Javascript对象是否存在的简单实例
May 18 Javascript
利用浮层使select不可选的实现方法
Dec 03 Javascript
js放到head中失效的原因与解决方法
Mar 07 Javascript
JavaScript数组的5种迭代方法
Sep 29 Javascript
react build 后打包发布总结
Aug 24 Javascript
vue+element-ui实现表格编辑的三种实现方式
Oct 31 Javascript
JavaScript中Dom操作实例详解
Jul 08 Javascript
React Native中ScrollView组件轮播图与ListView渲染列表组件用法实例分析
Jan 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
Zend Studio for Eclipse的java.lang.NullPointerException错误的解决方法
2008/12/06 PHP
php中处理mysql_fetch_assoc返回来的数组 不用foreach----echo
2011/05/04 PHP
比较discuz和ecshop的截取字符串函数php版
2012/09/03 PHP
变量声明时命名与变量作为对象属性时命名的区别解析
2013/12/06 Javascript
js实现表格字段排序
2014/02/19 Javascript
JavaScript实现的图像模糊算法代码分享
2014/04/22 Javascript
jQuery的观察者模式详解
2014/12/22 Javascript
详解JavaScript中的forEach()方法的使用
2015/06/08 Javascript
jQuery实现经典的网页3D轮播图封装功能【附源码下载】
2019/02/15 jQuery
利用Vconsole和Fillder进行移动端抓包调试方法
2019/03/05 Javascript
微信小程序扫描二维码获取信息实例详解
2019/05/07 Javascript
element ui分页多选,翻页记忆的实例
2019/09/03 Javascript
[09:22]2014DOTA2西雅图国际邀请赛 主赛事第二日TOPPLAY
2014/07/21 DOTA
[02:17]快乐加倍!DOTA2食人魔魔法师至宝+迎霜节活动上线
2019/12/22 DOTA
Python深入学习之闭包
2014/08/31 Python
用Python代码来绘制彭罗斯点阵的教程
2015/04/03 Python
将Python代码打包为jar软件的简单方法
2015/08/04 Python
对pandas中apply函数的用法详解
2018/04/10 Python
python中的字符串内部换行方法
2018/07/19 Python
使用Python如何测试InnoDB与MyISAM的读写性能
2018/09/18 Python
python pandas实现excel转为html格式的方法
2018/10/23 Python
Python开发企业微信机器人每天定时发消息实例
2020/03/17 Python
解决django FileFIELD的编码问题
2020/03/30 Python
python statsmodel的使用
2020/12/21 Python
python实现简单猜单词游戏
2020/12/24 Python
美国鲍勃商店:Bob’s Stores
2018/07/22 全球购物
自我鉴定范文300字
2013/10/01 职场文书
如何掌握自荐信格式呢
2013/11/19 职场文书
民族团结先进个人材料
2014/02/05 职场文书
机关党员2014全国两会学习心得体会
2014/03/10 职场文书
优秀语文教师事迹
2014/05/18 职场文书
伦敦奥运会口号
2014/06/13 职场文书
人事行政经理岗位职责
2014/06/18 职场文书
python xlwt模块的使用解析
2021/04/13 Python
MySQL中distinct和count(*)的使用方法比较
2021/05/26 MySQL
人工智能深度学习OpenAI baselines的使用方法
2022/05/20 Python