检测一个函数是否是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 相关文章推荐
js parentElement和offsetParent之间的区别
Mar 23 Javascript
jquery multiSelect 多选下拉框
Jul 09 Javascript
node.js中的fs.lchmodSync方法使用说明
Dec 16 Javascript
jquery实现的省市区三级联动
Apr 02 Javascript
javascript HTML+CSS实现经典橙色导航菜单
Feb 16 Javascript
JS数组返回去重后数据的方法解析
Jan 03 Javascript
Javascript 一些需要注意的细节(必看篇)
Jul 08 Javascript
详解AngularJS1.x学习directive 中‘& ’‘=’ ‘@’符号的区别使用
Aug 23 Javascript
node之本地服务器图片上传的方法示例
Mar 26 Javascript
jQuery使用ajax传递json对象到服务端及contentType的用法示例
Mar 12 jQuery
vue循环中点击选中再点击取消(单选)的实现
Sep 10 Javascript
js 图片懒加载的实现
Oct 21 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使用finfo_file()函数检测上传图片类型的实现方法
2017/04/18 PHP
PHP递归实现汉诺塔问题的方法示例
2017/11/25 PHP
PHP面向对象五大原则之开放-封闭原则(OCP)详解
2018/04/04 PHP
laravel获取不到session的三种解决办法【推荐】
2018/09/16 PHP
PHP数字金额转换成中文大写显示
2019/01/05 PHP
前台js调用后台方法示例
2013/12/02 Javascript
jquery mobile动态添加元素之后不能正确渲染解决方法说明
2014/03/05 Javascript
jquery淡化版banner异步图片文字效果切换图片特效
2014/04/08 Javascript
javascript精确统计网站访问量实例代码
2015/12/19 Javascript
js+css简单实现网页换肤效果
2015/12/29 Javascript
JQuery之proxy实现绑定代理方法
2016/08/01 Javascript
jquery select2的使用心得(推荐)
2016/12/04 Javascript
JS实现的简易拖放效果示例
2016/12/29 Javascript
angular4模块中给标签添加背景图的实现方法
2017/09/15 Javascript
AngularJS下$http服务Post方法传递json参数的实例
2018/03/29 Javascript
js实现json数组分组合并操作示例
2019/02/12 Javascript
JS解惑之Object中的key是有序的么
2019/05/06 Javascript
微信小程序开发实现消息推送
2020/11/18 Javascript
vue实现简单瀑布流布局
2020/05/28 Javascript
Vue+Element UI 树形控件整合下拉功能菜单(tree + dropdown +input)
2020/08/28 Javascript
ant-design-vue中的select选择器,对输入值的进行筛选操作
2020/10/24 Javascript
python中使用iterrows()对dataframe进行遍历的实例
2018/06/09 Python
python实现简单tftp(基于udp协议)
2018/07/30 Python
Pycharm 实现下一个文件引用另外一个文件的方法
2019/01/17 Python
对Python 简单串口收发GUI界面的实例详解
2019/06/12 Python
python+openCV调用摄像头拍摄和处理图片的实现
2019/08/06 Python
Python 在 VSCode 中使用 IPython Kernel 的方法详解
2020/09/05 Python
HTML5 canvas实现雪花飘落特效
2016/03/08 HTML / CSS
香港莎莎官网Sasa.com:亚洲著名国际化妆品商城
2019/11/10 全球购物
仓管员岗位职责范文
2013/11/08 职场文书
毕业生如何写自我鉴定
2014/03/15 职场文书
加多宝凉茶广告词
2014/03/18 职场文书
环保标语口号
2014/06/13 职场文书
车间核算员岗位职责
2014/07/01 职场文书
教你使用Pandas直接核算Excel中快递费用
2021/05/12 Python
java实现自定义时钟并实现走时功能
2022/06/21 Java/Android