判定是否原生方法的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,超强推荐expand.js
Dec 23 Javascript
各情景下元素宽高的获取实现代码
Sep 13 Javascript
js实现图片轮换效果代码
Apr 16 Javascript
浅谈javascript函数式编程
Sep 06 Javascript
JS实现新浪博客左侧的Blog管理菜单效果代码
Oct 22 Javascript
vue 2.8.2版本配置刚进入时候的默认页面方法
Sep 21 Javascript
vue-cli 打包后提交到线上出现 &quot;Uncaught SyntaxError:Unexpected token&quot; 报错
Nov 06 Javascript
JavaScript中的一些实用小技巧总结
Apr 07 Javascript
浅谈对于react-thunk中间件的简单理解
May 01 Javascript
vue-router源码之history类的浅析
May 21 Javascript
使用Vue CLI创建typescript项目的方法
Aug 09 Javascript
JavaScript中的全局属性与方法深入解析
Jun 14 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
历史证明,懒惰才是推动科学发展技术进步的动力
2021/03/02 无线电
PHP伪造来源HTTP_REFERER的方法实例详解
2015/07/06 PHP
分享10段PHP常用代码
2015/11/11 PHP
Jquery 表单取值赋值的一些基本操作
2009/10/11 Javascript
基于jQuery的弹出警告对话框美化插件(警告,确认和提示)
2010/06/10 Javascript
JS面向对象基础讲解(工厂模式、构造函数模式、原型模式、混合模式、动态原型模式)
2014/08/16 Javascript
Bootstrap中的Dropdown下拉菜单更改为悬停(hover)触发
2016/08/31 Javascript
jQuery图片轮播实现并封装(一)
2016/12/03 Javascript
node.js中实现kindEditor图片上传功能的方法教程
2017/04/26 Javascript
AngularJS select加载数据选中默认值的方法
2018/02/28 Javascript
vue2.0+vue-router构建一个简单的列表页的示例代码
2019/02/13 Javascript
让mocha支持ES6模块的方法实现
2020/01/14 Javascript
Python编程语言的35个与众不同之处(语言特征和使用技巧)
2014/07/07 Python
说一说Python logging
2016/04/15 Python
详解python3中zipfile模块用法
2018/06/18 Python
对python中词典的values值的修改或新增KEY详解
2019/01/20 Python
python 实现在tkinter中动态显示label图片的方法
2019/06/13 Python
Python 使用 prettytable 库打印表格美化输出功能
2019/12/26 Python
python opencv实现信用卡的数字识别
2020/01/12 Python
Python批量启动多线程代码实例
2020/02/18 Python
python自动下载图片的方法示例
2020/03/25 Python
PyCharm 光标变成黑块的解决方式
2021/02/06 Python
css3 实现圆形旋转倒计时
2018/02/24 HTML / CSS
Nordgreen手表德国官方网站:丹麦极简主义手表
2019/10/31 全球购物
美国折扣香水网站:The Perfume Spot
2020/12/12 全球购物
教师求职推荐信范文
2013/11/20 职场文书
前台文员岗位职责
2013/12/28 职场文书
打架检讨书500字
2014/01/29 职场文书
鸿星尔克广告词
2014/03/21 职场文书
创业培训计划书
2014/05/03 职场文书
最常使用的求职信
2014/05/25 职场文书
简单租房协议书范本
2014/08/20 职场文书
优胜劣汰,强者为王——读《鲁滨逊漂流记》有感
2019/08/15 职场文书
vue项目中的支付功能实现(微信支付和支付宝支付)
2022/02/18 Vue.js
以下牛机,你有几个
2022/04/05 无线电
Python Flask实现进度条
2022/05/11 Python