1. ホーム
  2. javascript

[解決済み] ES6クラスで "public static field "を作成するには?

2023-03-12 08:26:38

質問

Javascriptのクラスを作っているのですが、Javaのようなpublic staticフィールドを持ちたいと思っています。これは関連するコードです。

export default class Agent {
    CIRCLE: 1,
    SQUARE: 2,
    ...

このようなエラーが出ます。

line 2, col 11, Class properties must be methods. Expected '(' but instead saw ':'.

ES6モジュールはこれを許さないようです。希望する動作を得るための方法、あるいはゲッターを書かなければならないのでしょうか?

どのように解決するのですか?

アクセッサとstaticキーワードを使用して、public static fieldを作成します。

class Agent {
    static get CIRCLE() {
      return 1;
    }
    static get SQUARE() {
      return 2;
    }
}

Agent.CIRCLE; // 1

仕様書を見る 14.5 - クラス定義 - 怪しく関連するものを見ることになるでしょう :)

ClassElement[Yield] :

  MethodDefinition[?Yield](メソッド定義)。

静的 MethodDefinition[?Yield](メソッド定義) ;

ということで、そこから先は 14.5.14 - ランタイム・セマンティクス。ClassDefinitionEvaluation - それが本当にそのように見えることを行うかどうかを再確認します。具体的には、ステップ20です。

  1. 各ClassElement mについて、メソッドから順に
    1. もし mのIsStaticがfalseの場合 であれば
      1. mに対してPropertyDefinitionEvaluationを引数protoとfalseで実行した結果をstatusとする。
    2. Elseとする。
      1. mに対して、引数FとfalseでPropertyDefinitionEvaluationを実行した結果をstatusとする。
    3. ステータスが唐突に終了する場合
      1. 実行中の実行コンテキストのLexicalEnvironmentをlexに設定する。
      2. ステータスを返す。

IsStaticは、先に定義した 14.5.9

ClassElement : static MethodDefinition(静的メソッド定義

trueを返します。

そこで PropertyMethodDefinition は "F"(コンストラクタ、関数オブジェクト)を引数として呼び出され、その引数には はそのオブジェクトにアクセッサメソッドを作成します。 .

これは はすでに動作しています。 は少なくとも IETP (tech preview) で、また 6to5 と Traceur コンパイラで動作しています。