判定是否原生方法的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 相关文章推荐
字符串的replace方法应用浅析
Dec 06 Javascript
使用CSS样式position:fixed水平滚动的方法
Feb 19 Javascript
jQuery遍历之next()、nextAll()方法使用实例
Nov 08 Javascript
javascript结合Flexbox简单实现滑动拼图游戏
Feb 18 Javascript
JavaScript仿网易选项卡制作代码
Oct 06 Javascript
js中开关变量使用实例
Feb 24 Javascript
Webpack框架核心概念(知识点整理)
Dec 22 Javascript
使用D3.js构建实时图形的示例代码
Aug 28 Javascript
js限制输入框只能输入数字(onkeyup触发)
Sep 28 Javascript
在Web关闭页面时发送Ajax请求的实现方法
Mar 07 Javascript
对Layer UI 模块化的用法详解
Sep 26 Javascript
前端性能优化建议
Sep 17 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
PHPMyadmin 配置文件详解(配置)
2009/12/03 PHP
php 5.3.5安装memcache注意事项小结
2011/04/12 PHP
PHP函数eval()介绍和使用示例
2014/08/20 PHP
php中使用in_array() foreach array_search() 查找数组是否包含时的性能对比
2015/04/14 PHP
php base64 编码与解码实例代码
2017/03/21 PHP
详解php伪造Referer请求反盗链资源
2019/01/24 PHP
javascript显示选择目录对话框的代码
2008/11/10 Javascript
jQuery each()小议
2010/03/18 Javascript
JavaScript实现的in_array函数
2014/08/27 Javascript
如何屏蔽防止别的网站嵌入框架代码
2015/08/24 Javascript
jQuery使用animate实现ul列表项相互飘动效果示例
2016/09/16 Javascript
jQuery实现上传图片前预览效果功能
2017/08/03 jQuery
angularJs使用ng-repeat遍历后选中某一个的方法
2018/09/30 Javascript
用Golang运行JavaScript的实现示例
2019/11/25 Javascript
浅析TypeScript 命名空间
2020/03/19 Javascript
Vue实现点击当前行变色
2020/12/14 Vue.js
对于Python中RawString的理解介绍
2016/07/07 Python
Python基于回溯法子集树模板解决取物搭配问题实例
2017/09/02 Python
运用TensorFlow进行简单实现线性回归、梯度下降示例
2018/03/05 Python
SELENIUM自动化模拟键盘快捷键操作实现解析
2019/10/28 Python
Python实现大数据收集至excel的思路详解
2020/01/03 Python
PyCharm+PyQt5+QtDesigner配置详解
2020/08/12 Python
Python 实现一个简单的web服务器
2021/01/03 Python
浅析python字符串前加r、f、u、l 的区别
2021/01/24 Python
Camper鞋西班牙官方网上商店:西班牙马略卡岛的鞋类品牌
2019/03/14 全球购物
介绍一下gcc特性
2012/01/20 面试题
公司前台接待岗位职责
2013/12/03 职场文书
幼儿园校车司机的岗位职责
2014/01/30 职场文书
九年级英语教学反思
2014/01/31 职场文书
中学校庆方案
2014/03/17 职场文书
精神文明建设先进工作者事迹材料
2014/05/02 职场文书
民族学专业求职信
2014/07/28 职场文书
村官个人总结范文
2015/03/03 职场文书
交通处罚决定书
2015/06/24 职场文书
领导干部学习三严三实心得体会
2016/01/05 职场文书
Nginx中使用Lua脚本与图片的缩略图处理的实现
2022/03/18 Servers