如何检查 ECMAScript 6 类和函数之间的差异?

2024-02-12

在 ECMAScript 6 中typeof根据规范,类的数量是'function'.

但是,根据规范,您也不允许将通过类语法创建的对象作为普通函数调用来调用。换句话说,您必须使用new关键字,否则会抛出 TypeError。

TypeError: Classes can’t be function-called

因此,如果不使用 try catch(这会非常难看并且会破坏性能),您如何检查函数是否来自class语法或来自function syntax?


我认为检查函数是否为 ES6 类的最简单方法是检查结果.toString() https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Function/toString方法。根据es2015规范 https://people.mozilla.org/%7Ejorendorff/es6-draft.html#sec-function.prototype.tostring:

字符串表示形式必须具有 FunctionDeclaration FunctionExpression、GeneratorDeclaration、GeneratorExpression、类声明 https://tc39.es/ecma262/multipage/ecmascript-language-functions-and-classes.html#sec-class-definitions, 类表达式 https://tc39.es/ecma262/multipage/ecmascript-language-functions-and-classes.html#prod-ClassExpression、ArrowFunction、MethodDefinition 或 GeneratorMethod,具体取决于对象的实际特性

所以检查函数看起来很简单:

function isClass(func) {
  return typeof func === 'function' 
    && /^class\s/.test(Function.prototype.toString.call(func));
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何检查 ECMAScript 6 类和函数之间的差异? 的相关文章

随机推荐

  • Angular 应用程序中的空注释

    是否有任何配置设置可以删除这些空注释和空格 我的构建命令是ng build environment prod progress false target productiontsconfig 是 compileOnSave false co
  • Mysql 在键上连接两个表

    我正在尝试连接两个表 但似乎遇到问题 我正在寻找的输出是有主题的行数 SELECT FROM education AS a JOIN keys2 AS b USING List Idsubjek WHERE List Idsubjek IN
  • 在 C++ 中使用类似 C 的初始化或构造函数初始化是否被认为更好? [复制]

    这个问题在这里已经有答案了 可能的重复 什么时候应该使用直接初始化 什么时候应该使用复制初始化 https stackoverflow com questions 4293596 when should you use direct ini
  • Django Memcached 缓存消失

    我的 Django 应用程序配置了 memcached 一切都运行顺利 我试图随着时间的推移填充缓存 并在新数据从外部 API 传入时添加到缓存中 这是我正在进行的事情的要点 主视图 api query more results apiQu
  • WPF C# 设计问题中绘制图表

    一个月前 我有一个项目 我使用 Windows 窗体在应用程序中绘制了股票图表 我通过创建一个可以拉伸到窗口尺寸的位图来做到这一点 这将允许我的图表随窗口调整大小 我现在正在使用 WPF 扩展该项目 我一直在尝试为该项目进行设计 但我似乎不
  • C/C++ 中的指针帮助 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我想了解 C 和 C 中的指针 它如
  • 如何在 VueJS 中测试全局事件总线

    In this article https medium com vuejobs create a global event bus in vue js 838a5d9ab03a解释了如何在 VueJS 中使用全局事件总线 它描述了使用在单
  • 从命令提示符创建 apk 文件

    我想从命令提示符创建 apk 文件 为此我遵循这个链接 http developer android com guide developing building building cmdline html 并尝试用 ant 完成它 但它给了
  • Python while循环输出到List

    我编写了一个简单的代码 它将 wav 文件作为输入 然后查找频率并返回相应的音符 但是 为了添加更多功能 我需要输出为列表 我所拥有的简化伪代码如下所示 while some condition true compute various t
  • 是否可以使用 sha1 和 sha256 证书对安装程序和卸载程序进行双重签名?

    Inno Setup 中是否可以同时使用 sha1 和 sha256 对卸载程序和安装程序进行签名 我知道它是可以签署 https stackoverflow com a 30671378 1329977通过命令工具具有两个证书的可执行文件
  • 如何解决 Gradle 构建中的存储库证书错误

    我安装了最新版本的android studio 我已经安装了jdk 8 当我打开 android studio 时 出现以下错误 Unable to resolve dependency for app debugUnitTest comp
  • 动画背景java游戏

    我正在编写一个类似于小行星的游戏 但我不明白如何在后台生成小行星 现在我在主类中生成了一个小行星 但我想为小行星创建一个类 我该怎么做 主班 public void paintComponent Graphics g super paint
  • 使用鼠标在 openGL 中移动绘图

    我试图在按住鼠标左键的同时在 openGL 中移动图像 我不想拖动物体 只是移动整个图片 它是分形的二维绘图 我被告知我可以使用 gluortho2d 但我找不到任何信息或类似的尝试如何做到这一点 我假设类似的事情 void mouse c
  • log4j休眠错误

    配置休眠时出现此错误 log4j WARN No appenders could be found for logger org hibernate cfg annotations Version log4j WARN Please ini
  • 如何将 Groovy 类导入 Jenkinsfile?

    如何在 Jenkinsfile 中导入 Groovy 类 我尝试了几种方法 但没有一个有效 这是我要导入的类 Thing groovy class Thing void doStuff 这些是行不通的事情 Jenkinsfile 1 nod
  • 如何在 application.yaml 中设置 logback.xml 属性

    I have logback xml像这样
  • 将小数字加载到 64 位 x86 寄存器中

    在 64 位 x86 CPU 下 通常我们将数字 1 加载到寄存器中 如下所示 mov rdx 1 48BAFFFFFFFFFFFFFFFF 该指令按照旧版本 NASM 的组装方式占用 10 个字节 另一种方法是 xor rdx rdx 4
  • MySQL服务器和MySQL客户端有什么区别

    在 Ubuntu 中 我通常安装两者 但是 MySQL 的客户端和服务器之间有什么区别 另外 当一个新的声明提到它需要 MySQL 5 x 时 它是指客户端 服务器还是两者都需要 例如这个链接https dev mysql com doc
  • 如果我在打字稿中使用 `module("somelib")`,它就无法在浏览器中运行

    我正在尝试在客户端使用带有 angularjs 的打字稿 我发现如果我使用外部模块 生成的js将无法在浏览器中运行 控制器 ts
  • 如何检查 ECMAScript 6 类和函数之间的差异?

    在 ECMAScript 6 中typeof根据规范 类的数量是 function 但是 根据规范 您也不允许将通过类语法创建的对象作为普通函数调用来调用 换句话说 您必须使用new关键字 否则会抛出 TypeError TypeError