检测一个函数是否是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 相关文章推荐
JSQL  一个 web DB 的封装
May 05 Javascript
js取消单选按钮选中并判断对象是否为空
Nov 14 Javascript
js格式化金额可选是否带千分位以及保留精度
Jan 28 Javascript
如何调试异步加载页面里包含的js文件
Oct 30 Javascript
JS模仿手机端九宫格登录功能实现代码
Apr 28 Javascript
深入理解Ajax的get和post请求
Jun 02 Javascript
jquery操作select取值赋值与设置选中实例
Feb 28 Javascript
vue2.0 自定义 饼状图 (Echarts)组件的方法
Mar 02 Javascript
小程序封装路由文件和路由方法(5种全解析)
May 26 Javascript
Bootstrap 时间日历插件bootstrap-datetimepicker配置与应用小结
May 28 Javascript
微信小程序使用npm包的方法步骤
Aug 13 Javascript
如何在vue中使用video.js播放m3u8格式的视频
Feb 01 Vue.js
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获取某个目录大小的代码
2008/09/10 PHP
PHP缓存技术的使用说明
2011/08/06 PHP
js获取上传文件大小示例代码
2014/04/10 Javascript
checkbox勾选判断代码分析
2014/06/11 Javascript
js使用Array.prototype.sort()对数组对象排序的方法
2015/01/28 Javascript
angularjs创建弹出框实现拖动效果
2020/08/25 Javascript
javascript仿百度输入框提示自动下拉补全
2016/01/07 Javascript
nodejs socket服务端和客户端简单通信功能
2017/09/14 NodeJs
微信小程序版翻牌小游戏
2018/01/26 Javascript
Vue中的Props(不可变状态)
2018/09/29 Javascript
Javascript 实现 Excel 导入生成图表功能
2018/10/22 Javascript
webpack4之如何编写loader的方法步骤
2019/06/06 Javascript
Centos7 安装Node.js10以上版本的方法步骤
2019/10/15 Javascript
vue封装可复用组件confirm,并绑定在vue原型上的示例
2019/10/31 Javascript
使用 Angular RouteReuseStrategy 缓存(路由)组件的实例代码
2019/11/01 Javascript
vue项目创建步骤及路由router
2020/01/14 Javascript
Vue中keep-alive的两种应用方式
2020/07/15 Javascript
js实现简单选项卡制作
2020/08/05 Javascript
Flask框架的学习指南之制作简单blog系统
2016/11/20 Python
Python 查找字符在字符串中的位置实例
2018/05/02 Python
对django后台admin下拉框进行过滤的实例
2019/07/26 Python
ansible动态Inventory主机清单配置遇到的坑
2020/01/19 Python
Python 序列化和反序列化库 MarshMallow 的用法实例代码
2020/02/25 Python
PyQT5速成教程之Qt Designer介绍与入门
2020/11/02 Python
python excel多行合并的方法
2020/12/09 Python
使用css3实现的windows8开机加载动画
2014/12/09 HTML / CSS
KIKO MILANO英国官网:意大利知名化妆品和护肤品品牌
2017/09/25 全球购物
英国皇家造币厂:The Royal Mint
2018/10/05 全球购物
美术毕业生求职信
2014/02/25 职场文书
喜之郎果冻广告词
2014/03/20 职场文书
产品质量保证书
2014/04/29 职场文书
一般基层干部群众路线教育实践活动个人对照检查材料
2014/11/04 职场文书
2016年安全月活动总结
2016/04/06 职场文书
nginx 防盗链防爬虫配置详解
2021/03/31 Servers
使用python求解迷宫问题的三种实现方法
2022/03/17 Python
JavaScript获取URL参数的方法分享
2022/04/07 Javascript