ES6 类变量替代方案

2024-01-30

目前,在 ES5 中,我们许多人在框架中使用以下模式来创建类和类变量,这很舒服:

// ES 5
FrameWork.Class({

    variable: 'string',
    variable2: true,

    init: function(){

    },

    addItem: function(){

    }

});

在 ES6 中,您可以本地创建类,但没有选项可以拥有类变量:

// ES6
class MyClass {
    const MY_CONST = 'string'; // <-- this is not possible in ES6
    constructor(){
        this.MY_CONST;
    }
}

遗憾的是,上面的方法不起作用,因为类只能包含方法。

我明白我可以this.myVar = true in constructor…但我不想“垃圾”我的构造函数,尤其是当我有 20-30 个以上的参数用于更大的类时。

我想了很多方法来解决这个问题,但还没有找到好的方法。 (例如:创建一个ClassConfig处理程序,并传递一个parameter对象,与类分开声明。然后处理程序将附加到该类。我在想WeakMaps也以某种方式整合。)

你会有什么样的想法来处理这种情况?


2018年更新:

现在有一个第三阶段的提案 - 我期待着在几个月内使这个答案过时。

与此同时,任何使用 TypeScript 或 babel 的人都可以使用以下语法:

varName = value

在类声明/表达式体内,它将定义一个变量。希望在几个月/几周内我能够发布更新。

更新:Chrome 74 现在附带此语法。


ES wiki 中关于 ES6 提案的注释(最大最小类 http://wiki.ecmascript.org/doku.php?id=strawman:maximally_minimal_classes) note:

(有意)没有直接的声明方式来定义原型数据属性(方法除外)类属性或实例属性

类属性和原型数据属性需要在声明之外创建。

类定义中指定的属性被分配与对象字面量中出现的属性相同的属性。

这意味着您所要求的内容已被考虑,并明确决定反对。

但为什么?

好问题。 TC39 的好心人希望通过类声明来声明和定义类的功能。不是它的成员。 ES6 类声明为其用户定义了其契约。

请记住,类定义定义了原型方法 - 在原型上定义变量通常不是您要做的事情。 当然,您可以使用:

constructor(){
    this.foo = bar
}

在构造函数中,就像你建议的那样。另请参阅.

ES7 及更高版本

ES7 的一项新提案正在制定中,该提案允许通过类声明和表达式更简洁的实例变量 -https://esdiscuss.org/topic/es7-property-initializers https://esdiscuss.org/topic/es7-property-initializers

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ES6 类变量替代方案 的相关文章

随机推荐

  • 从 DbVisualizer 连接到 H2 服务器

    我的 H2 数据库配置如下 Configuration Profile Profiles DEV public class DevDataSourceConfiguration Bean initMethod start destroyMe
  • 如何使用 Windows 搜索 API 将文件夹添加到 Windows 索引列表中

    在索引选项中 索引这些位置 中有一个位置列表 有没有办法通过 C 将从我的应用程序创建的文件夹添加到列表中 我找到了一个解决方案 任何想要让他们的应用程序文件夹支持 C 中的 windows 搜索的人都可以这样做 下载 Windows 搜索
  • XAML 和 Windows Mobile(.Net Compact Framework)

    Windows Mobile 上是否支持 XAML 不是来自微软 不是 Windows CE R3添加了Silverlight http www microsoft com windowsembedded en us products wi
  • 如何从“groupby”对象的“单元格”中获取值?

    假设我有以下数据框 A B C D 0 foo one 1 10 1 bar one 2 20 2 foo two 3 30 3 bar one 4 40 4 foo two 5 50 5 bar two 6 60 6 foo one 7
  • 如何更改文本字段的文本大小和字段大小?

    我正在尝试创建一个类似这样的输入 SwiftUI 我已经取得了进展 但我不知道如何更改文本字段的高度并使输入文本大小更大 您可以通过更改占位符文本的字体大小来更改文本大小 这会自动调整占位符文本的字体大小 TextField的身高 就您而言
  • 无法安装 Android SDK 17 [重复]

    这个问题在这里已经有答案了 可能的重复 Android 更新到 Android SDK 工具修订版 7 时遇到问题 https stackoverflow com questions 4360894 android trouble upda
  • Docker 命令不再响应

    大多数 docker 命令永远不会结束 我必须用 CTRL C 手动中断它们 即使是简单的命令 例如docker ps or docker info不回应 然而 docker help and docker version还在工作 我认为特
  • 标准输入到 powershell 脚本

    我正在运行一个服务 它可以调用外部进程来修改文本流 然后再将其返回到服务 文本流从服务传递到 stdout 上的外部进程 并从 stdin 上的服务读取修改后的结果 换句话说 外部过程 命令 可以用作文本 过滤器 我想使用 powershe
  • AdapterView 不支持 addView(View)

    我开始进行 Android 开发 并且在标题上遇到了该错误 这是我的 Contacts java package us inevent toot import android os Bundle import android support
  • AWS 无法删除网络接口

    在AWS中 我有网络接口 但我无法删除它们 因为它们应该正在使用中 我尝试过通过强制选项将它们分开 但这不起作用 我如何识别网络接口使用的对象 查找网络接口所连接的资源的最佳方法是检查 ENI 的 描述 字段 根据资源类型 此描述字段可能会
  • 避免空指针

    我正在用 C 11 实现我自己的编程语言 我设计的数据类型之一是Token班级 它旨在存储从源文件读取的标记 以及标记的内容 类型以及遇到的行 令牌可以是单字符符号 长字符串 数字或名称 因此它需要能够存储不同的数据类型 可以是用于符号的字
  • Apache 重写规则类似于 Nginx try_files

    在 Nginx 中 我使用了 try files 它基本上接受对域上文件的任何请求 并将其通过名为 file parse php 的自定义 php 脚本传递 在 Nginx 中 它看起来像这样 try files url file pars
  • 对于具有 Float 原始值的 Swift 枚举,“枚举案例的原始值不是唯一的”

    根据Swift 编程语言 https developer apple com library mac documentation Swift Conceptual Swift Programming Language Enumeration
  • return new RedirectResult() 与 return Redirect()

    以下两个控制器 ActionResult 返回语句有什么区别 return new RedirectResult http www google com false and return Redirect http www google c
  • 如何检查“sudo 0.4.1 jurko 5”及更新版本中正在生成/接收哪些 SUD?

    这个问题与这个问题类似 如何输出正在生成 接收的肥皂水 https stackoverflow com questions 4426204 how can i output what suds is generating receiving
  • RecyclerView LinearLayout 管理器在横向模式下始终返回 -1 - findLastCompletelyVisibleItemPosition()

    我在用着findLastCompletelyVisibleItemPosition 确定 RecyclerView 中的最后一个可见项目 这是我如何设置布局的代码片段 mRecyclerView setHasFixedSize true L
  • 如何从结构中提取索引最高的专业化?

    我正在尝试进行一些模板元编程 并且发现需要 提取 某种类型的某种结构的专门化的最高索引 例如 如果我有一些类型 struct A template
  • 区分 Jersey、Jackson 和 JaxB API

    嗨 我一直在内部使用 Jackson 进行 JSON 处理 我想将这些对象作为 Json 提供给外部 API REST 现在 它们在内部存储为 java 对象 明显的实现是编写某种查询引擎来读取请求 从底层数据存储中检索对象 然后使用 Ja
  • 从 Mercurial 中的单个本地存储库推送到多个远程存储库

    我正在考虑使用 AppHarbor 托管一个轻量级网站 并正在研究他们的 Mercurial 集成 目前我使用 Kiln 作为远程存储库 但目前 AppHarbor 仅支持 BitBucket 集成 一个本地存储库可以有 2 个远程存储库吗
  • ES6 类变量替代方案

    目前 在 ES5 中 我们许多人在框架中使用以下模式来创建类和类变量 这很舒服 ES 5 FrameWork Class variable string variable2 true init function addItem functi