检测一个函数是否是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.Autocomplete插件 支持中文输入法 避免TAB、ENTER键失效、导致表单提交
Oct 11 Javascript
JQuery插件Style定制化方法的分析与比较
May 03 Javascript
jQuery输入城市查看地图使用介绍
May 08 Javascript
js判断undefined变量类型使用typeof
Jun 03 Javascript
鼠标滑在标题上显示图片的JS代码
Nov 19 Javascript
深入分析escape()、encodeURI()、encodeURIComponent()的区别及示例
Aug 04 Javascript
Javascript实现单张图片浏览
Dec 18 Javascript
解决vue-cli项目webpack打包后iconfont文件路径的问题
Sep 01 Javascript
extract-text-webpack-plugin用法详解
Feb 14 Javascript
Jquery ajax书写方法代码实例解析
Jun 12 jQuery
Ajax异步刷新功能及简单案例
Nov 20 Javascript
vue实现列表垂直无缝滚动
Apr 08 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生成文件
2007/01/15 PHP
Discuz 5.0 中读取纯真IP数据库函数分析
2007/03/16 PHP
Apache中php.ini的设置方法
2013/02/28 PHP
CentOS下搭建PHP环境与WordPress博客程序的全流程总结
2016/05/07 PHP
php 运算符与表达式详细介绍
2016/11/30 PHP
关于ThinkPhp 框架表单验证及ajax验证问题
2017/07/19 PHP
php慢查询日志和错误日志使用详解
2021/02/27 PHP
如何在标题栏显示框架内页面的标题
2007/02/03 Javascript
javascript 贪吃蛇实现代码
2008/11/22 Javascript
jQuery编辑器KindEditor4.1.4代码高亮显示设置教程
2013/03/01 Javascript
NodeJS学习笔记之(Url,QueryString,Path)模块
2015/01/13 NodeJs
jQuery实现首页顶部可伸缩广告特效代码
2015/04/15 Javascript
深入浅出 jQuery中的事件机制
2016/08/23 Javascript
ionic2自定义cordova插件开发以及使用(Android)
2017/06/19 Javascript
5分钟打造简易高效的webpack常用配置
2017/07/04 Javascript
jQuery.Sumoselect插件实现下拉复选框效果
2017/11/09 jQuery
Bootstrap实现可折叠分组侧边导航菜单
2018/03/07 Javascript
Vue中插入HTML代码的方法
2018/09/21 Javascript
vue路由导航守卫和请求拦截以及基于node的token认证的方法
2019/04/07 Javascript
javascript实现手动点赞效果
2019/04/09 Javascript
vue实现多级菜单效果
2019/10/19 Javascript
nodejs环境使用Typeorm连接查询Oracle数据
2019/12/05 NodeJs
Node中对非阻塞I/O、事件循环的知识点总结
2020/01/05 Javascript
JS出现404错误原理及解决方案
2020/07/01 Javascript
[40:16]TFT vs Mski Supermajor小组赛C组 BO3 第二场 6.3
2018/06/04 DOTA
python存储16bit和32bit图像的实例
2018/12/05 Python
python binascii 进制转换实例
2019/06/12 Python
Django模型修改及数据迁移实现解析
2019/08/01 Python
Python中的特殊方法以及应用详解
2020/09/20 Python
利用css3画个同心圆示例代码
2017/07/03 HTML / CSS
h5网页水印SDK的实现代码示例
2019/02/19 HTML / CSS
毕业实习评语
2014/02/10 职场文书
创建卫生先进单位实施方案
2014/03/10 职场文书
主办会计岗位职责
2014/03/13 职场文书
公共艺术专业自荐信
2014/09/01 职场文书
vue中的可拖拽宽度div的实现示例
2022/04/08 Vue.js