检测一个函数是否是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中的数学函数
Apr 04 Javascript
Ajax同步与异步传输的示例代码
Nov 21 Javascript
纯JS实现根据CSS的class选择DOM
Mar 22 Javascript
页面刷新时记住滚动条的位置jquery代码
Jun 17 Javascript
js代码实现无缝滚动(文字和图片)
Aug 20 Javascript
javascript高级选择器querySelector和querySelectorAll全面解析
Apr 07 Javascript
JS实现选定指定HTML元素对象中指定文本内容功能示例
Feb 13 Javascript
JavaScript中重名的函数与对象示例详析
Sep 28 Javascript
ES6的异步终极解决方案分享
Jul 11 Javascript
VUE组件中的 Drawer 抽屉实现代码
Aug 06 Javascript
vue+vant使用图片预览功能ImagePreview的问题解决
Apr 10 Javascript
JS页面动态绘图工具SVG,Canvas,VML介简介
Oct 16 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中让上传的文件大小在上传前就受限制的两种解决方法
2013/06/24 PHP
php加速器eAccelerator的配置参数、API详解
2014/05/05 PHP
PHP使用stream_context_create()模拟POST/GET请求的方法
2016/04/02 PHP
php快速排序原理与实现方法分析
2016/05/26 PHP
thinkphp框架表单数组实现图片批量上传功能示例
2020/04/04 PHP
Javascript执行效率全面总结
2013/11/04 Javascript
js截取固定长度的中英文字符的简单实例
2013/11/22 Javascript
js简单的表格添加行和删除行操作示例
2014/03/31 Javascript
jQuery判断指定id的对象是否存在的方法
2015/05/22 Javascript
Jsonp post 跨域方案
2015/07/06 Javascript
JQuery实现的按钮倒计时效果
2015/12/23 Javascript
JavaScript中apply方法的应用技巧小结
2016/09/29 Javascript
bootstrap fileinput 上传插件的基础使用
2017/02/17 Javascript
从零学习node.js之详解异步控制工具async(八)
2017/02/27 Javascript
jQuery实现简单的抽奖游戏
2017/05/05 jQuery
js制作简单的音乐播放器的示例代码
2017/08/28 Javascript
vue 2.0项目中如何引入element-ui详解
2017/09/06 Javascript
JS Input里添加小图标的两种方法
2017/11/11 Javascript
解决Vue打包之后文件路径出错的问题
2018/03/06 Javascript
使用Vue.js开发微信小程序开源框架mpvue解析
2018/03/20 Javascript
es6 for循环中let和var区别详解
2020/01/12 Javascript
JS数组方法shift()、unshift()用法实例分析
2020/01/18 Javascript
微信小程序吸底区域适配iPhoneX的实现
2020/04/09 Javascript
Node.js 中判断一个文件是否存在
2020/08/24 Javascript
Python入门学习指南分享
2018/04/11 Python
python实现Windows电脑定时关机
2018/06/20 Python
Python input函数使用实例解析
2019/11/22 Python
CSS3 二级导航菜单的制作的示例
2018/04/02 HTML / CSS
美国男士和女士奢侈品折扣手表购物网站:Certified Watch Store
2018/06/13 全球购物
英国在线购买马术服装:EQUUS
2019/07/12 全球购物
Mybag美国/加拿大:英国奢华包包和名牌手袋网站
2020/02/16 全球购物
餐厅经理岗位职责范本
2014/02/17 职场文书
融资租赁计划书
2014/04/29 职场文书
毕业生求职信范文
2014/06/29 职场文书
学生意外伤害赔偿协议书
2014/09/17 职场文书
优秀共产党员主要事迹材料
2015/11/05 职场文书