检测一个函数是否是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 Validation Plugin验证插件手动验证
Jan 26 Javascript
JavaScript实现斗地主游戏的思路
Feb 29 Javascript
使用bootstrap typeahead插件实现输入框自动补全之问题及解决办法
Jul 07 Javascript
老生常谈js中0到底是 true 还是 false
Mar 08 Javascript
使用jquery的jsonp如何发起跨域请求及其原理详解
Aug 17 jQuery
基于three.js编写的一个项目类示例代码
Jan 05 Javascript
JavaScript类数组对象转换为数组对象的方法实例分析
Jul 24 Javascript
Vue.js中 v-model 指令的修饰符详解
Dec 03 Javascript
JS遍历JSON数组及获取JSON数组长度操作示例【测试可用】
Dec 12 Javascript
vue+django实现一对一聊天功能的实例代码
Jul 17 Javascript
JS sort排序详细使用方法示例解析
Sep 27 Javascript
使用jquery实现轮播图效果
Jan 02 jQuery
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
透析PHP的配置文件php.ini
2006/10/09 PHP
php防盗链的常用方法小结
2010/07/02 PHP
php下正则来匹配dede模板标签的代码
2010/08/21 PHP
浅析php数据类型转换
2014/01/09 PHP
php判断手机访问还是电脑访问示例分享
2014/01/20 PHP
PHP程序员的技术成长规划
2016/03/25 PHP
Laravel (Lumen) 解决JWT-Auth刷新token的问题
2019/10/24 PHP
javascript 弹出层组件(升级版)
2011/05/12 Javascript
关于jQuery中.attr()和.prop()的问题探讨
2013/09/06 Javascript
jQuery的ready方法详解
2014/11/27 Javascript
jQuery幻灯片特效代码分享--鼠标滑过按钮时切换(2)
2020/11/18 Javascript
JSON键值对序列化和反序列化解析
2017/01/24 Javascript
JavaScript基本类型值-Number类型
2017/02/24 Javascript
jQuery插件HighCharts绘制的基本折线图效果示例【附demo源码下载】
2017/03/07 Javascript
JavaScript组件开发之输入框加候选框
2017/03/10 Javascript
移动端web滚动分页的实现方法
2017/05/05 Javascript
原生JS封装animate运动框架的实例
2017/10/12 Javascript
Vue中的无限加载vue-infinite-loading的方法
2018/04/08 Javascript
JavaScript实现模态对话框实例
2020/01/13 Javascript
JavaScript实现放大镜效果代码示例
2020/04/29 Javascript
详解js创建对象的几种方式和对象方法
2021/03/01 Javascript
[01:03:18]DOTA2-DPC中国联赛 正赛 RNG vs Dynasty BO3 第一场 1月29日
2021/03/11 DOTA
一个月入门Python爬虫学习,轻松爬取大规模数据
2018/01/03 Python
解决pyinstaller打包pyqt5的问题
2019/01/08 Python
django之自定义软删除Model的方法
2019/08/14 Python
python创建ArcGIS shape文件的实现
2019/12/06 Python
python向xls写入数据(包括合并,边框,对齐,列宽)
2021/02/02 Python
Booking.com英国官网:全球酒店在线预订网站
2018/04/21 全球购物
公司合作意向书范文
2014/07/30 职场文书
社保委托书怎么写
2014/08/02 职场文书
2014年法务工作总结
2014/12/11 职场文书
本科毕业论文致谢怎么写
2015/05/14 职场文书
2021-4-3课程——SQL Server查询【2】
2021/04/05 SQL Server
Java基础之详解HashSet的使用方法
2021/06/30 Java/Android
MongoDB支持的数据类型
2022/04/11 MongoDB
Tomcat弱口令复现及利用
2022/05/06 Servers