检测一个函数是否是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 相关文章推荐
根据地区不同显示时间的javascript代码
Aug 13 Javascript
JavaScript 封装Ajax传递的数据代码
Jun 05 Javascript
使用jQuery调用XML实现无刷新即时聊天
Aug 07 Javascript
AngularJS 自定义指令详解及示例代码
Aug 17 Javascript
基于jQuery实现顶部导航栏功能
Dec 27 Javascript
解决React Native端口号修改的方法
Jul 28 Javascript
微信小程序实现获取自己所处位置的经纬度坐标功能示例
Nov 30 Javascript
Node错误处理笔记之挖坑系列教程
Jun 05 Javascript
vue中使用element-ui进行表单验证的实例代码
Jun 22 Javascript
浅谈JavaScript 代码简洁之道
Jan 09 Javascript
在Vue项目中用fullcalendar制作日程表的示例代码
Aug 04 Javascript
微信小程序关键字变色实现代码实例
Dec 13 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
隐藏你的.php文件的实现方法
2007/03/19 PHP
PHP变量内存分配问题记录整理
2013/11/27 PHP
php更新修改excel中的内容实例代码
2014/02/26 PHP
学习PHP Cookie处理函数
2016/08/09 PHP
理解Javascript_03_javascript全局观
2010/10/11 Javascript
jquery uaMatch源代码
2011/02/14 Javascript
js中各浏览器中鼠标按键值的差异
2011/04/07 Javascript
jquery中html、val与text三者属性取值的联系与区别介绍
2013/12/29 Javascript
ANGULARJS中用NG-BIND指令实现单向绑定的例子
2014/12/08 Javascript
javascript实现tab切换的两个实例
2015/11/05 Javascript
js实现网页的两个input标签内的数值加减(示例代码)
2017/08/15 Javascript
element ui table(表格)实现点击一行展开功能
2018/12/04 Javascript
微信小程序中使用echarts的实现方法
2019/04/24 Javascript
vuex管理状态仓库使用详解
2020/07/29 Javascript
python获取beautifulphoto随机某图片代码实例
2013/12/18 Python
Python 通过pip安装Django详细介绍
2017/04/28 Python
详解Python如何生成词云的方法
2018/06/01 Python
TensorFlow 合并/连接数组的方法
2018/07/27 Python
python3.6.3转化为win-exe文件发布的方法
2018/10/31 Python
对Python定时任务的启动和停止方法详解
2019/02/19 Python
Python定时任务随机时间执行的实现方法
2019/08/14 Python
python利用JMeter测试Tornado的多线程
2020/01/12 Python
python软件测试Jmeter性能测试JDBC Request(结合数据库)的使用详解
2021/01/26 Python
瑞士网球商店:Tennis-Point
2020/03/12 全球购物
环境科学毕业生自荐信
2013/11/21 职场文书
会计电算化学生个人的自我评价
2014/02/08 职场文书
军训自我鉴定200字
2014/02/13 职场文书
师德师风承诺书
2014/05/23 职场文书
物业公司的岗位任命书
2014/06/06 职场文书
管理工程专业求职信
2014/08/10 职场文书
接收函格式
2015/01/30 职场文书
公司联欢会主持词
2015/07/04 职场文书
单身狗福利?Python爬取某婚恋网征婚数据
2021/06/03 Python
python字符串的多行输出的实例详解
2021/06/08 Python
分享Python异步爬取知乎热榜
2022/04/12 Python
Win11 KB5015814遇安装失败 影响开始菜单性能解决方法
2022/07/15 数码科技