Get to know MDN better
このページはコミュニティーの尽力で英語から翻訳されました。MDN Web Docs コミュニティーについてもっと知り、仲間になるにはこちらから。
This feature is well established and works across many devices and browser versions. It’s been available across browsers since 2022年9月.
パブリックフィールドは、書き込み可能、列挙可能、構成不可のプロパティであり、それぞれのクラスインスタンスまたはクラスコンストラクターで定義されます。
それ以外にも構文上の制約があります。
このページでは、パブリックインスタンスフィールドについて詳しく紹介します。
パブリックインスタンスフィールドは、作成されたクラスのすべてのインスタンスに存在します。パブリックフィールドを宣言することで、そのフィールドが常に存在することを保証することができ、クラスの定義がより自己文書化されます。
パブリックインスタンスフィールドは、基底クラスではコンストラクターが実行される前の時点でインスタンスに追加され、サブクラスでは super() が返された直後に追加されます。初期化子のないフィールドは undefined に初期化されます。プロパティと同様に、フィールド名は計算することができます。
計算されたフィールド名は、クラス定義時点で一度だけ評価されます。これは、クラスごとに常に固定された一連のフィールド名を持つことを意味しており、2つのインスタンスが計算された名前によって異なるフィールド名を持つことはありません。計算式の this 値はクラス定義を囲む this であり、クラス名を参照することは ReferenceError となります。この式では await と yield は期待通りに動作します。
フィールド初期化子の中では、thisは作成中のクラスインスタンスを参照し、superは基底クラスの prototype プロパティを参照します。このプロパティには基底クラスのインスタンスメソッドが格納されていますが、インスタンスフィールドは格納されていません。
フィールドの初期化式は、新しいインスタンスが作成されるたびに評価されます。(this の値はインスタンスごとに異なるので、初期化式はインスタンス固有のプロパティにアクセスすることができます。)
式は同期的に評価されます。初期化式で await や yield を使用することはできません。(初期化式は暗黙的に関数に包まれていると考えてください。)
クラスのインスタンスフィールドは、それぞれのコンストラクターが実行される前に追加されるので、コンストラクター内でフィールドの値にアクセスすることができます。しかし、派生クラスのインスタンスフィールドは super() を返した後に定義されるので、基底クラスのコンストラクターが派生クラスのフィールドにアクセスすることはできません。
フィールドは 1 つずつ追加されます。フィールド初期化子はその上のフィールドの値を参照することはできますが、その下のフィールドの値を参照することはできません。インスタンスメソッドと静的メソッドはすべて事前に追加され、アクセスすることができますが、初期化されているフィールドより下のフィールドを参照している場合、呼び出すと期待した動作をしないことがあります。
メモ: これはプライベートフィールドではより重要です。初期化されていないプライベートフィールドにアクセスすると、たとえプライベートフィールドが下記で宣言されていても TypeError が発生するからです。(プライベートフィールドが宣言されていない場合は、早期に SyntaxError となります。)
クラスフィールドは [[DefineOwnProperty]] の意味づけ(本質的には Object.defineProperty())を使用して追加されるため、派生クラスのフィールド宣言は基底クラスのセッターを呼び出すことはありません。この動作は、コンストラクターで this.field = … を使用するのとは異なります。
メモ: クラスフィールドの仕様が最終的に [[DefineOwnProperty]] の意味づけで決定される以前は、 Babel や tsc を含むほとんどのトランスパイラーはクラスフィールドを DerivedWithConstructor 形式に変換しており、クラスフィールドが標準化された後に微妙なバグが発生していました。
クラスフィールドはコンストラクターの引数に依存できないので、フィールド初期化子は通常、インスタンスごとに同じ値として評価されます(Math.random() やオブジェクト初期化子のように、同じ式が時刻ごとに異なる値として評価できる場合を除きます)。
しかし、空であってもクラスフィールドを宣言することは有益です。フィールドの存在を示すことで、人間の読者だけでなく型チェッカーもクラスの形状を静的に分析できるようになるからです。
上のコードは冗長なように見えますが、 this が動的に変更される場合を考えてみましょう。明示的にフィールド宣言を行うと、インスタンスに必ず存在するフィールドが明確になります。
初期化子は基底クラスが実行された後に評価されるので、基底クラスのコンストラクターで作成したプロパティにアクセスすることができます。
| ECMAScript® 2027 Language Specification # prod-FieldDefinition |
Enable JavaScript to view this browser compatibility table.
This page was last modified on 2025年9月13日 by MDN contributors.
Your blueprint for a better internet.
Visit Mozilla Corporation’s not-for-profit parent, the Mozilla Foundation.
Portions of this content are ©1998–2026 by individual mozilla.org contributors. Content available under a Creative Commons license.