判定是否原生方法的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 相关文章推荐
用js来解决ajax读取页面乱码
Nov 28 Javascript
JS操作Cookies包括(读取添加与删除)
Dec 26 Javascript
js给页面加style无效果的解决方法
Jan 20 Javascript
JavaScript类型系统之正则表达式
Jan 05 Javascript
微信小程序开发之视频播放器 Video 弹幕 弹幕颜色自定义实例
Dec 08 Javascript
Angular组件化管理实现方法分析
Mar 17 Javascript
easyui简介_动力节点Java学院整理
Jul 14 Javascript
详谈innerHTML innerText的使用和区别
Aug 18 Javascript
JS实现遍历不规则多维数组的方法
Mar 21 Javascript
微信小程序获取公众号文章列表及显示文章的示例代码
Mar 10 Javascript
javascript运行机制之执行顺序理解
Aug 03 Javascript
Echarts如何重新渲染实例详解
May 30 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
叶罗丽:为什么大家对颜冰这对CP非常关心,却对金茉两人十分冷漠
2020/03/17 国漫
php strstr查找字符串中是否包含某些字符的查找函数
2010/06/03 PHP
比较全面的PHP数组的使用方法小结
2010/09/23 PHP
ThinkPHP字符串函数及常用函数汇总
2014/07/18 PHP
PHP语法小结之基础和变量
2015/11/22 PHP
php+jQuery+Ajax实现点赞效果的方法(附源码下载)
2020/07/21 PHP
javascript基础的动画教程,直观易懂
2007/01/10 Javascript
document.open() 与 document.write()的区别
2007/08/13 Javascript
一个级联菜单代码学习及removeClass与addClass的应用
2013/01/24 Javascript
Table冻结表头示例代码
2013/08/20 Javascript
jquery实现的淡入淡出下拉菜单效果
2015/08/25 Javascript
jquery对复选框(checkbox)的操作汇总
2016/01/13 Javascript
JavaScript 计算笛卡尔积实例详解
2016/12/02 Javascript
vue.js 上传图片实例代码
2017/06/22 Javascript
Node接收电子邮件的实例代码
2017/07/21 Javascript
详解vue + vuex + directives实现权限按钮的思路
2017/10/24 Javascript
Vue修改mint-ui默认样式的方法
2018/02/03 Javascript
详解离线安装npm包的几种方法
2018/11/25 Javascript
nodejs中方法和模块用法示例
2018/12/24 NodeJs
javascript实现抢购倒计时程序
2019/08/26 Javascript
vue.js中ref及$refs的使用方法解析
2019/10/08 Javascript
Vue项目结合Vue-layer实现弹框式编辑功能(实例代码)
2020/03/11 Javascript
用Python制作简单的钢琴程序的教程
2015/04/01 Python
python开发之文件操作用法实例
2015/11/13 Python
Django 导出项目依赖库到 requirements.txt过程解析
2019/08/23 Python
Django中modelform组件实例用法总结
2020/02/10 Python
英国最大的宠物商店:Pets at Home
2019/04/17 全球购物
法学专业本科生自荐信范文
2013/12/17 职场文书
中学生学雷锋活动心得体会
2014/03/10 职场文书
三月学雷锋月活动总结
2014/04/28 职场文书
“四风”问题自我剖析材料思想汇报
2014/09/23 职场文书
单位工作证明书格式
2014/10/04 职场文书
2015年乡镇卫生院妇幼保健工作总结
2015/05/19 职场文书
使用pytorch实现线性回归
2021/04/11 Python
Django与数据库交互的实现
2021/06/03 Python
pandas中对文本类型数据的处理小结
2021/11/01 Python