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 2023年3月.
静的初期化ブロックはクラス内で宣言されます。これは、クラスの初期化の時に評価される文を格納します。これにより、静的プロパティよりも柔軟な初期化ロジックが可能になり、 try...catch を使用したり、 1 つの値から複数のフィールドを設定したりすることができます。初期化は現在のクラス宣言のコンテキストで実行され、プライベート要素にアクセスすることができます。つまり、インスタンスのプライベートフィールドを持つクラスと、同じスコープで宣言された他のクラスや関数との間で情報を共有するためにも使用できます(C++ の "friend" クラスに似ています)。
静的初期化ブロックを使わない場合、クラス宣言の後で静的メソッドを呼び出すことで、複雑な静的初期化を行うことができます。
しかし、この手法では実装の詳細(init() メソッド)がクラスのユーザーに公開されてしまいます。一方、クラスの外部で宣言された初期化ロジックはプライベート静的フィールドにアクセスすることはできません。静的初期化ブロックでは、任意の初期化ロジックをクラス内で宣言し、クラスの評価中に実行することができます。
class は、そのクラス本体に任意の数の static {} 初期化ブロックを置くことができます。 これらのブロックは、宣言された順に、静的フィールド初期化子とともに評価されます。 スーパークラスの静的初期化は、そのサブクラスの初期化よりも先に実行されます。
静的ブロックの内部で宣言された変数のスコープは、そのブロックのローカルなものです。ここには初期化ブロック内で宣言された var, function, const, let は、そのブロックのローカル変数であるため、 var 宣言は静的ブロックの外に巻き上げされることはありません。
静的ブロック内の this は、そのクラスのコンストラクター オブジェクトを参照します。 super.プロパティ を使用して、スーパークラスの静的プロパティにアクセスすることができます。 ただし、クラスの静的初期化ブロック内で super() を呼び出したり、 arguments オブジェクトを使用したりするのは構文エラーであることに注意してください。
式は同期的に評価されます。初期化子式で(await や yield)を使用することはできません。(初期化子式は暗黙に関数に包まれていると考えてください)。
静的ブロックのスコープは、クラス本体の字句スコープの中で入れ子になり、構文エラーを発生させることなく、クラス内で宣言されたプライベート名にアクセスすることができます。
静的フィールド初期化子と静的初期化ブロックは、 1 つずつ評価されます。フィールド初期化子は、それより上のフィールド値を参照することはできますが、それより下のフィールド値を参照することはできません。静的メソッドはすべて事前に追加され、アクセスすることができますが、初期化されるフィールドより下のフィールドを参照している場合、呼び出すと期待した動作をしないことがあります。
メモ: これはプライベート静的フィールドではより重要です。初期化されていないプライベートフィールドにアクセスすると、たとえそのプライベートフィールドが下で宣言されていたとしても、 TypeError が発生するからです。(プライベートフィールドが宣言されていない場合は、早期に SyntaxError となります。)
静的初期化ブロックはデコレーターを持つことができません(クラス自身は持つことができます)。
下記コードは、静的初期化ブロックと静的フィールド初期化子を挟み込んだクラスを示すものです。 出力は、ブロックとフィールドが実行順に評価されることを示しています。
スーパークラスの静的な初期化は、サブクラスの初期化よりも最初に行われることに注意してください。
静的ブロック内の this は、そのクラスのコンストラクター オブジェクトを参照します。 このコードは、パブリック静的フィールドにアクセスする方法を示しています。
super.property 構文を static ブロックの中で使用すると、スーパークラスの静的プロパティを参照することができます。
下記は、クラス外のオブジェクトからクラスのプライベートインスタンスフィールドにアクセスを許可する例です(v8.dev blogより)。
| ECMAScript® 2027 Language Specification # prod-ClassStaticBlock |
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.