检测一个函数是否是JavaScript原生函数的小技巧


Posted in Javascript onMarch 13, 2015

在我的开发工作中经常会遇到需要判断一个函数是否是JavaScript原生函数的情况,有时候这是一个很必要的工作,你需要知道这个函数是浏览器自身提供的,还是由第三方封装、伪装成原生函数。当然,最好的方法是考察执行这个函数的toString方法的返回值。

The JavaScript

完成这个任务的方法非常简单:

function isNative(fn) {

 return (/\{\s*\[native code\]\s*\}/).test('' + fn);

}

toString方法会返回这个方法的字符串形式,然后用正则表达式判断里面包含的字符。

更强悍的方法

Lodash的创始人John-David Dalton找到了一个更佳的方案:

;(function() {
  // Used to resolve the internal `[[Class]]` of values

  var toString = Object.prototype.toString;

  

  // Used to resolve the decompiled source of functions

  var fnToString = Function.prototype.toString;

  

  // Used to detect host constructors (Safari > 4; really typed array specific)

  var reHostCtor = /^\[object .+?Constructor\]$/;
  // Compile a regexp using a common native method as a template.

  // We chose `Object#toString` because there's a good chance it is not being mucked with.

  var reNative = RegExp('^' +

    // Coerce `Object#toString` to a string

    String(toString)

    // Escape any special regexp characters

    .replace(/[.*+?^${}()|[\]\/\\]/g, '\\$&')

    // Replace mentions of `toString` with `.*?` to keep the template generic.

    // Replace thing like `for ...` to support environments like Rhino which add extra info

    // such as method arity.

    .replace(/toString|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'

  );

  

  function isNative(value) {

    var type = typeof value;

    return type == 'function'

      // Use `Function#toString` to bypass the value's own `toString` method

      // and avoid being faked out.

      ? reNative.test(fnToString.call(value))

      // Fallback to a host object check because some environments will represent

      // things like typed arrays as DOM methods which may not conform to the

      // normal native pattern.

      : (value && type == 'object' && reHostCtor.test(toString.call(value))) || false;

  }

  

  // export however you want

  module.exports = isNative;

}());

现在你也看到了,很复杂,但更强大。当然,这不是为了做安全防护,它只是给你提供是否是原生函数的相关信息。
Javascript 相关文章推荐
从零开始学习jQuery (八) 插播:jQuery实施方案
Feb 23 Javascript
js中的屏蔽的使用示例
Jul 30 Javascript
JavaScript实现的双向跨域插件分享
Jan 31 Javascript
JavaScript取得WEB安全颜色列表的方法
Jul 14 Javascript
javascript简单比较日期大小的方法
Jan 05 Javascript
Javascript使用function创建类的两种方法(推荐)
Nov 19 Javascript
JS获得多个同name 的input输入框的值的实现方法
Jan 09 Javascript
JavaScript模块详解
Dec 18 Javascript
详解node.js 下载图片的 2 种方式
Mar 02 Javascript
vue中进入详情页记住滚动位置的方法(keep-alive)
Sep 21 Javascript
微信小程序使用npm支持踩坑
Nov 07 Javascript
小程序分享模块超级详解(推荐)
Apr 10 Javascript
DOM操作一些常用的属性汇总
Mar 13 #Javascript
JavaScript获取页面上被选中文字的方法技巧
Mar 13 #Javascript
jQuery源码分析之Callbacks详解
Mar 13 #Javascript
JavaScript获取伪元素(Pseudo-Element)属性的方法技巧
Mar 13 #Javascript
Javascript定义类(class)的三种方法详解
Mar 13 #Javascript
JavaScript中5种调用函数的方法
Mar 12 #Javascript
JavaScript实现的一个倒计时的类
Mar 12 #Javascript
You might like
ajax实现无刷新分页(php)
2010/07/18 PHP
PHP实现删除非站内外部链接实例代码
2014/06/17 PHP
php验证码实现代码(3种)
2015/09/07 PHP
php array_reverse 以相反的顺序返回数组实例代码
2017/04/11 PHP
PHP+fiddler抓包采集微信文章阅读数点赞数的思路详解
2019/12/20 PHP
laravel开发环境homestead搭建过程详解
2020/07/03 PHP
js或css文件后面跟参数的原因说明
2010/01/09 Javascript
浅析js设置控件的readonly与enabled属性问题
2013/12/25 Javascript
js出生日期 年月日级联菜单示例代码
2014/01/10 Javascript
ztree获取选中节点时不能进入可视区域出现BUG如何解决
2015/12/03 Javascript
Bootstrap导航栏各元素操作方法(表单、按钮、文本)
2015/12/28 Javascript
JavaScript截取、切割字符串的技巧
2016/01/07 Javascript
js严格模式总结(分享)
2016/08/22 Javascript
详解jQuery停止动画——stop()方法的使用
2016/12/14 Javascript
JavaScript 正则命名分组【推荐】
2018/06/07 Javascript
JavaScript之实现一个简单的Vue示例
2019/01/17 Javascript
es6 filter() 数组过滤方法总结
2019/04/03 Javascript
微信小程序实现商城倒计时
2020/11/01 Javascript
JavaScript RegExp 对象用法详解
2019/09/24 Javascript
nodejs实现的http、https 请求封装操作示例
2020/02/06 NodeJs
vue-cli点击实现全屏功能
2020/03/07 Javascript
JavaScript Tab菜单实现过程解析
2020/05/13 Javascript
antd vue 刷新保留当前页面路由,保留选中菜单,保留menu选中操作
2020/08/06 Javascript
python3抓取中文网页的方法
2015/07/28 Python
Python决策树和随机森林算法实例详解
2018/01/30 Python
Python爬虫文件下载图文教程
2018/12/23 Python
python实现websocket的客户端压力测试
2019/06/25 Python
django template实现定义临时变量,自定义赋值、自增实例
2020/07/12 Python
台湾饭店和机票预订网站:Expedia台湾
2016/08/05 全球购物
行政办公员自我评价分享
2013/12/14 职场文书
土木工程专业个人求职信
2013/12/30 职场文书
婚礼证婚人证婚词
2014/01/08 职场文书
高二化学教学反思
2014/01/30 职场文书
农业生产宣传标语
2014/10/08 职场文书
行政处罚听证告知书
2015/07/01 职场文书
SQL Server 中的事务介绍
2022/05/20 SQL Server