检测一个函数是否是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 表单验证扩展(三)
Oct 20 Javascript
javascript设计模式 接口介绍
Jul 24 Javascript
JS 实现Table相同行的单元格自动合并示例代码
Aug 27 Javascript
window.open打开页面居中显示的示例代码
Dec 27 Javascript
jQuery实现form表单基于ajax无刷新提交方法详解
Dec 08 Javascript
angular2使用简单介绍
Mar 01 Javascript
node模块机制与异步处理详解
Mar 13 Javascript
jQuery实现的鼠标经过时变宽的效果(附demo源码)
Apr 28 Javascript
详解原生JavaScript实现jQuery中AJAX处理的方法
May 10 Javascript
js鼠标按键事件和键盘按键事件用法实例汇总
Oct 03 Javascript
Vue.js系列之项目搭建(1)
Jan 03 Javascript
Vue 实例事件简单示例
Sep 19 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
国产动画《伍六七》原声大碟大卖,啊哈娱乐引领音乐赋能IP的新尝试
2020/03/08 国漫
PHP开发文件系统实例讲解
2006/10/09 PHP
一个用php实现的获取URL信息的类
2007/01/02 PHP
PHP获取当前页面URL函数实例
2014/10/22 PHP
PHP中round()函数对浮点数进行四舍五入的方法
2014/11/19 PHP
php探针使用原理和技巧讲解
2019/09/17 PHP
phpstudy隐藏index.php的方法
2020/09/21 PHP
Javascript 浮点运算的问题分析与解决方法
2013/08/27 Javascript
Javascript 学习笔记之 对象篇(二) : 原型对象
2014/06/24 Javascript
javascritp添加url参数将参数加入到url中
2014/09/25 Javascript
jQuery实现可用于博客的动态滑动菜单
2015/03/09 Javascript
jquery模拟实现鼠标指针停止运动事件
2016/01/12 Javascript
JQuery点击行tr实现checkBox选中的简单实例
2016/05/26 Javascript
javascript中this用法实例详解
2017/04/06 Javascript
angular5 子组件监听父组件传入值的变化方法
2018/09/30 Javascript
如何利用vue+vue-router+elementUI实现简易通讯录
2019/05/13 Javascript
使用preload预加载页面资源时注意事项
2020/02/03 Javascript
vue+elementUI中表格高亮或字体颜色改变操作
2020/11/02 Javascript
Python访问MySQL封装的常用类实例
2014/11/11 Python
Python+selenium实现截图图片并保存截取的图片
2018/01/05 Python
python 利用栈和队列模拟递归的过程
2018/05/29 Python
浅谈Python traceback的优雅处理
2018/08/31 Python
python实现两张图片拼接为一张图片并保存
2019/07/16 Python
在python中实现同行输入/接收多个数据的示例
2019/07/20 Python
python队列原理及实现方法示例
2019/11/27 Python
Python importlib动态导入模块实现代码
2020/04/16 Python
解决导入django_filters不成功问题No module named 'django_filter'
2020/07/15 Python
openCV提取图像中的矩形区域
2020/07/21 Python
使用HTML5在网页中嵌入音频和视频播放的基本方法
2016/02/22 HTML / CSS
JackJones官方旗舰店:杰克琼斯男装
2018/03/27 全球购物
中专毕业生自荐信
2013/11/16 职场文书
单位工作证明格式模板
2014/10/04 职场文书
2015年加油站站长工作总结
2015/05/27 职场文书
党员身份证明材料
2015/06/19 职场文书
田径运动会通讯稿
2015/07/18 职场文书
2016年世界人口日宣传活动总结
2016/04/05 职场文书