判定是否原生方法的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 回调函数中变量作用域的讨论
Sep 11 Javascript
Javascript学习笔记4 Eval函数
Jan 11 Javascript
JQuery+CSS提示框实现思路及代码(纯手工打造)
May 07 Javascript
jquery原创弹出层折叠效果点击折叠弹出一个层
Mar 12 Javascript
jQuery多项选项卡的实现思路附样式及代码
Jun 03 Javascript
Node.js 去掉种子(torrent)文件里的邪恶信息
Mar 27 Javascript
JavaScript使用slice函数获取数组部分元素的方法
Apr 06 Javascript
javascript点击按钮实现隐藏显示切换效果
Feb 03 Javascript
JavaScript的Ext JS框架中的GridPanel组件使用指南
May 21 Javascript
javascript 玩转Date对象(实例讲解)
Jul 11 Javascript
浅析Javascript中双等号(==)隐性转换机制
Oct 27 Javascript
vue+iview框架实现左侧动态菜单功能的示例代码
Jul 23 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
人族 TERRAN 概述
2020/03/14 星际争霸
Re:从零开始的异世界生活 第2季 开播啦
2020/07/24 日漫
PHP邮件专题
2006/10/09 PHP
destoon实现公司新闻详细页添加评论功能的方法
2014/07/15 PHP
PHP SPL标准库之SplFixedArray使用实例
2015/05/12 PHP
php curl模拟post请求和提交多维数组的示例代码
2015/11/19 PHP
PHP实现微信提现(企业付款到零钱)
2019/08/01 PHP
详解jquery中$.ajax方法提交表单
2014/11/03 Javascript
javascript实现连续赋值
2015/08/10 Javascript
jQuery+Ajax实现无刷新操作
2016/01/04 Javascript
总结JavaScript的正则与其他语言的不同之处
2016/08/25 Javascript
vue.js入门教程之绑定class和style样式
2016/09/02 Javascript
Bootstrap文件上传组件之bootstrap fileinput
2016/11/25 Javascript
浅析JavaScript动画模拟拖拽原理
2016/12/09 Javascript
JS实现动画兼容性的transition和transform实例分析
2016/12/13 Javascript
使用jQuery操作DOM的方法小结
2017/02/27 Javascript
JS实现线性表的顺序表示方法示例【经典数据结构】
2017/04/11 Javascript
基于vue.js的分页插件详解
2017/11/27 Javascript
Vue中Axios从远程/后台读取数据
2019/01/21 Javascript
使用RxJS更优雅地进行定时请求详析
2019/06/02 Javascript
Python中index()和seek()的用法(详解)
2017/04/27 Python
Python cv2 图像自适应灰度直方图均衡化处理方法
2018/12/07 Python
Pycharm pyuic5实现将ui文件转为py文件,让UI界面成功显示
2020/04/08 Python
html5 Canvas画图教程(9)—canvas中画出矩形和圆形
2013/01/09 HTML / CSS
泰国第一的化妆品网站:Konvy
2018/02/25 全球购物
思想政治教育专业个人求职信范文
2013/12/20 职场文书
商务英语求职自荐信范文
2013/12/24 职场文书
高中生的自我鉴定范文
2014/01/24 职场文书
国际商务英语专业求职信
2014/07/08 职场文书
小学庆六一活动总结
2014/08/28 职场文书
建筑工地文明标语
2014/10/09 职场文书
php TP5框架生成二维码链接
2021/04/01 PHP
使用Spring处理x-www-form-urlencoded方式
2021/11/02 Java/Android
MySQL中优化SQL语句的方法(show status、explain分析服务器状态信息)
2022/04/09 MySQL
html中两种获取标签内的值的方法
2022/06/16 jQuery
React更新渲染原理深入分析
2022/12/24 Javascript