判定是否原生方法的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 相关文章推荐
JQuery index()方法使用代码
Jun 02 Javascript
JS限制上传图片大小不使用控件在本地实现
Dec 19 Javascript
jquery validate 自定义验证方法介绍 日期验证
Feb 27 Javascript
js实现日历可获得指定日期周数及星期几示例分享(js获取星期几)
Mar 14 Javascript
jquery实现美观的导航菜单鼠标提示特效代码
Sep 06 Javascript
jQuery文字横向滚动效果的实现代码
May 31 Javascript
脚本div实现拖放功能(两种)
Feb 13 Javascript
详解升级react-router 4 踩坑指南
Aug 14 Javascript
Angularjs中的验证input输入框只能输入数字和小数点的写法(推荐)
Aug 16 Javascript
js中document.write和document.writeln的区别
Mar 11 Javascript
Vue表单demo v-model双向绑定问题
Jun 29 Javascript
JavaScript数据结构与算法之二叉树添加/删除节点操作示例
Mar 01 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中如何调用用户自定义函数
2013/08/06 PHP
php教程之phpize使用方法
2014/02/12 PHP
Thinkphp框架开发移动端接口(2)
2016/08/18 PHP
php实现文件上传及头像预览功能
2017/01/15 PHP
PHP实现数组转JSon和JSon转数组的方法示例
2018/06/14 PHP
PHP xpath()函数讲解
2019/02/11 PHP
xml 封装与解析(javascript和C#中)
2009/07/26 Javascript
cnblogs中在闪存中屏蔽某人的实现代码
2010/11/14 Javascript
jquery制作搜狐快站页面效果示例分享
2014/02/21 Javascript
IE6中链接A的href为javascript协议时不在当前页面跳转
2014/06/05 Javascript
js 加密压缩出现bug解决方案
2014/11/25 Javascript
javascript获取select标签选中的值
2016/06/04 Javascript
基于JS实现数字+字母+中文的混合排序方法
2016/06/06 Javascript
浅谈js基本数据类型和typeof
2016/08/09 Javascript
canvas压缩图片转换成base64格式输出文件流
2017/03/09 Javascript
JavaScript实现QQ聊天消息展示和评论提交功能
2017/05/22 Javascript
通俗解释JavaScript正则表达式快速记忆
2017/08/23 Javascript
Vue与Node.js通过socket.io通信的示例代码
2018/07/25 Javascript
JavaScript常用工具方法封装
2019/02/12 Javascript
elementUI Tree 树形控件的官方使用文档
2019/04/25 Javascript
在vue+element ui框架里实现lodash的debounce防抖
2019/11/13 Javascript
python中from module import * 的一个坑
2014/07/20 Python
跟老齐学Python之大话题小函数(1)
2014/10/10 Python
python插入数据到列表的方法
2015/04/30 Python
python3爬虫之设计签名小程序
2018/06/19 Python
python安装scipy的步骤解析
2019/09/28 Python
python实现字典嵌套列表取值
2019/12/16 Python
使用Python脚本从文件读取数据代码实例
2020/01/19 Python
如何利用Python识别图片中的文字
2020/05/31 Python
HTML5边玩边学(1)画布实现方法
2010/09/21 HTML / CSS
英国最大的女士服装零售商:Bonmarché
2017/08/17 全球购物
帕克纽约:PARKER NY
2018/12/09 全球购物
意大利消费电子产品购物网站:SLG Store
2019/12/26 全球购物
毕业自我鉴定怎么写
2014/03/25 职场文书
物流管理系毕业生求职信
2014/06/03 职场文书
道路运输企业安全生产责任书
2014/07/28 职场文书