检测一个函数是否是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之ajax删除详解
Feb 27 Javascript
JavaScript 模块的循环加载实现方法
Dec 13 Javascript
微信小程序 常见问题总结(4058,40013)及解决办法
Jan 11 Javascript
xmlplus组件设计系列之列表(4)
Apr 26 Javascript
Vue-router结合transition实现app前进后退动画切换效果的实例
Oct 11 Javascript
JsChart组件使用详解
Mar 04 Javascript
bootstrap select2插件用ajax来获取和显示数据的实例
Aug 09 Javascript
vue多次循环操作示例
Feb 08 Javascript
微信小程序上传图片到php服务器的方法
May 23 Javascript
微信小程序使用npm包的方法步骤
Aug 13 Javascript
解决Echarts2竖直datazoom滑动后显示数据不全的问题
Jul 20 Javascript
VUE 单页面使用 echart 窗口变化时的用法
Jul 30 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 的ArrayAccess接口 像数组一样来访问你的PHP对象
2010/10/12 PHP
PHP验证码类代码( 最新修改,完全定制化! )
2010/12/02 PHP
php面向对象中static静态属性与方法的内存位置分析
2015/02/08 PHP
Linux系统递归生成目录中文件的md5的方法
2015/06/29 PHP
Laravel框架自定义验证过程实例分析
2019/02/01 PHP
jquery 锁定弹出层实现代码
2010/02/23 Javascript
扩展JavaScript功能的正确方法(译文)
2012/04/12 Javascript
javascript关于继承的用法汇总
2014/12/20 Javascript
jquery移动节点实例
2015/01/14 Javascript
javascript制作的滑动图片菜单
2015/05/15 Javascript
jQuery简单实现仿京东分类导航层效果
2016/06/07 Javascript
只需五句话搞定JavaScript作用域(经典)
2016/07/26 Javascript
JS中from 表单序列化提交的代码
2017/01/20 Javascript
Vue响应式原理深入解析及注意事项
2017/12/11 Javascript
Angular Renderer (渲染器)的具体使用
2018/05/03 Javascript
nodejs微信开发之接入指南
2019/03/17 NodeJs
ES11屡试不爽的新特性,你用上了几个
2020/10/21 Javascript
[04:21]狐狸妈带你到现场 DOTA2 TI中国区预选赛线下赛路线指引
2014/05/22 DOTA
[01:45]亚洲邀请赛互动指南虚拟物品介绍
2015/01/30 DOTA
全面了解Python环境配置及项目建立
2016/06/30 Python
python实现判断一个字符串是否是合法IP地址的示例
2018/06/04 Python
浅析Python四种数据类型
2018/09/26 Python
Python 单元测试(unittest)的使用小结
2018/11/14 Python
Python面向对象程序设计构造函数和析构函数用法分析
2019/04/12 Python
PyCharm+Pipenv虚拟环境开发和依赖管理的教程详解
2020/04/16 Python
Python读取二进制文件代码方法解析
2020/06/22 Python
使用Keras预训练好的模型进行目标类别预测详解
2020/06/27 Python
HTML5 canvas基本绘图之文字渲染
2016/06/27 HTML / CSS
美国最大的宠物药店:1-800-PetMeds
2016/10/02 全球购物
大学生如何写自荐信
2014/01/08 职场文书
工程类专业自荐信范文
2014/03/09 职场文书
高二学生评语大全
2014/04/25 职场文书
推普周国旗下讲话稿
2014/09/21 职场文书
爱情保证书
2015/01/17 职场文书
初中数学教学反思范文
2016/02/17 职场文书