判定是否原生方法的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常用代码段整理
Nov 30 Javascript
js分页工具实例
Jan 28 Javascript
JS实现日期时间动态显示的方法
Dec 07 Javascript
JS实现上下左右对称的九九乘法表
Feb 22 Javascript
AngularJs bootstrap搭载前台框架——基础页面
Sep 01 Javascript
AngularJS基于ngInfiniteScroll实现下拉滚动加载的方法
Dec 14 Javascript
Angular.js之作用域scope'@','=','&amp;'实例详解
Feb 28 Javascript
Vue.js实现多条件筛选、搜索、排序及分页的表格功能
Nov 24 Javascript
JScript实现地址选择功能
Aug 15 Javascript
基于jQuery使用Ajax动态执行模糊查询功能
Jul 05 jQuery
layui-tree实现Ajax异步请求后动态添加节点的方法
Sep 23 Javascript
js实现简单的打印表格
Jan 15 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
使用php发送有附件的电子邮件-(PHPMailer使用的实例分析)
2013/04/26 PHP
YII实现分页的方法
2014/07/09 PHP
解决ThinkPHP关闭调试模式时报错的问题汇总
2015/04/22 PHP
PHP中SQL查询语句的id=%d解释(推荐)
2016/12/10 PHP
php数值转换时间及时间转换数值用法示例
2017/05/18 PHP
javascript cookie操作类的实现代码小结附使用方法
2010/06/02 Javascript
javascript模版引擎-tmpl的bug修复与性能优化分析
2011/10/23 Javascript
js实现倒计时(距离结束还有)示例代码
2013/07/24 Javascript
Jquery中val()表单取值赋值的实例代码
2013/08/15 Javascript
js获取url参数代码实例分享(JS操作URL)
2013/12/13 Javascript
JavaScript中输出标签的方法
2014/08/27 Javascript
javascript使用Promise对象实现异步编程
2016/03/01 Javascript
原生JS实现风箱式demo,并封装了一个运动框架(实例代码)
2016/07/22 Javascript
基于cssSlidy.js插件实现响应式手机图片轮播效果
2016/08/30 Javascript
JS基于onclick事件实现单个按钮的编辑与保存功能示例
2017/02/13 Javascript
详解Vue.use自定义自己的全局组件
2017/06/14 Javascript
JS实现数组去重方法总结(六种方法)
2017/07/14 Javascript
jquery实现用户登陆界面(示例讲解)
2017/09/06 jQuery
vue配置接口域名方法总结
2019/05/12 Javascript
利用Vue-draggable组件实现Vue项目中表格内容的拖拽排序
2019/06/07 Javascript
js实现内置计时器
2019/12/16 Javascript
微信小程序点击item使之滚动到屏幕中间位置
2020/03/25 Javascript
[01:45]2014DOTA2 TI预选赛预选赛 战前探营!
2014/05/21 DOTA
[01:39](回顾)各路豪强针锋相对,几经鏖战四强产生
2014/07/01 DOTA
以Python的Pyspider为例剖析搜索引擎的网络爬虫实现方法
2015/03/30 Python
python3实现在二叉树中找出和为某一值的所有路径(推荐)
2019/12/26 Python
python爬虫开发之selenium模块详细使用方法与实例全解
2020/03/09 Python
python 6行代码制作月历生成器
2020/09/18 Python
分享一个python的aes加密代码
2020/12/22 Python
美国乒乓球设备、配件和服装品牌:Killerspin
2020/06/07 全球购物
服务行业演讲稿
2014/09/02 职场文书
2015年发展党员工作总结报告
2015/03/31 职场文书
惹女朋友生气检讨书
2015/05/06 职场文书
python爬取豆瓣电影TOP250数据
2021/05/23 Python
详解vue身份认证管理和租户管理
2021/05/25 Vue.js
如何设计高效合理的MySQL查询语句
2021/05/26 MySQL