éçåæåãããã¯
Baseline
Widely available
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" ã¯ã©ã¹ã«ä¼¼ã¦ãã¾ãï¼ã
試ãã¦ã¿ã¾ããã
class ClassWithStaticInitializationBlock {
static staticProperty1 = "Property 1";
static staticProperty2;
static {
this.staticProperty2 = "Property 2";
}
}
console.log(ClassWithStaticInitializationBlock.staticProperty1);
// äºæ³ãããçµæ: "Property 1"
console.log(ClassWithStaticInitializationBlock.staticProperty2);
// äºæ³ãããçµæ: "Property 2"
æ§æ
class ClassWithSIB {
static {
// â¦
}
}
解説
éçåæåãããã¯ã使ããªãå ´åãã¯ã©ã¹å®£è¨ã®å¾ã§éçã¡ã½ãããå¼ã³åºããã¨ã§ãè¤éãªéçåæåãè¡ããã¨ãã§ãã¾ãã
class MyClass {
static init() {
// ãã©ã¤ãã¼ãéçãã£ã¼ã«ãã«ã¢ã¯ã»ã¹ãããã¨ãã§ãã
}
}
MyClass.init();
ãããããã®ææ³ã§ã¯å®è£
ã®è©³ç´°ï¼init() ã¡ã½ããï¼ãã¯ã©ã¹ã®ã¦ã¼ã¶ã¼ã«å
¬éããã¦ãã¾ãã¾ãã䏿¹ãã¯ã©ã¹ã®å¤é¨ã§å®£è¨ãããåæåãã¸ãã¯ã¯ãã©ã¤ãã¼ãéçãã£ã¼ã«ãã«ã¢ã¯ã»ã¹ãããã¨ã¯ã§ãã¾ãããéçåæåãããã¯ã§ã¯ãä»»æã®åæåãã¸ãã¯ãã¯ã©ã¹å
ã§å®£è¨ããã¯ã©ã¹ã®è©ä¾¡ä¸ã«å®è¡ãããã¨ãã§ãã¾ãã
class ã¯ããã®ã¯ã©ã¹æ¬ä½ã«ä»»æã®æ°ã® static {} åæåãããã¯ãç½®ããã¨ãã§ãã¾ãã
ãããã®ãããã¯ã¯ã宣è¨ãããé ã«ãéçãã£ã¼ã«ãåæååã¨ã¨ãã«è©ä¾¡ããã¾ãã
ã¹ã¼ãã¼ã¯ã©ã¹ã®éçåæåã¯ããã®ãµãã¯ã©ã¹ã®åæåãããå
ã«å®è¡ããã¾ãã
éçãããã¯ã®å
é¨ã§å®£è¨ããã夿°ã®ã¹ã³ã¼ãã¯ããã®ãããã¯ã®ãã¼ã«ã«ãªãã®ã§ããããã«ã¯åæåãããã¯å
ã§å®£è¨ããã var, function, const, let ã¯ããã®ãããã¯ã®ãã¼ã«ã«å¤æ°ã§ããããã var 宣è¨ã¯éçãããã¯ã®å¤ã«å·»ãä¸ãããããã¨ã¯ããã¾ããã
var y = "Outer y";
class A {
static field = "Inner y";
static {
// var y ã¯ãããã¯ã®ä¸ã«ããå·»ãä¸ããããªã
console.log(y); // undefined <-- not 'Outer y'
var y = this.field;
}
}
// éçãããã¯ã§å®ç¾©ããã var y ã¯
// ãããã¯ã®å¤ã«å·»ãä¸ããããªã
console.log(y); // 'Outer y'
éçãããã¯å
ã® this ã¯ããã®ã¯ã©ã¹ã®ã³ã³ã¹ãã©ã¯ã¿ã¼ ãªãã¸ã§ã¯ããåç
§ãã¾ãã
super.ãããã㣠ã使ç¨ãã¦ãã¹ã¼ãã¼ã¯ã©ã¹ã®éçããããã£ã«ã¢ã¯ã»ã¹ãããã¨ãã§ãã¾ãã
ãã ããã¯ã©ã¹ã®éçåæåãããã¯å
ã§ super() ãå¼ã³åºãããã arguments ãªãã¸ã§ã¯ãã使ç¨ãããããã®ã¯æ§æã¨ã©ã¼ã§ãããã¨ã«æ³¨æãã¦ãã ããã
å¼ã¯åæçã«è©ä¾¡ããã¾ããåæååå¼ã§ï¼await ã yieldï¼ã使ç¨ãããã¨ã¯ã§ãã¾ãããï¼åæååå¼ã¯æé»ã«é¢æ°ã«å
ã¾ãã¦ããã¨èãã¦ãã ããï¼ã
éçãããã¯ã®ã¹ã³ã¼ãã¯ãã¯ã©ã¹æ¬ä½ã®åå¥ã¹ã³ã¼ãã®ä¸ã§å ¥ãåã«ãªããæ§æã¨ã©ã¼ãçºçããããã¨ãªããã¯ã©ã¹å ã§å®£è¨ããããã©ã¤ãã¼ãåã«ã¢ã¯ã»ã¹ãããã¨ãã§ãã¾ãã
éçãã£ã¼ã«ãåæååã¨éçåæåãããã¯ã¯ã 1 ã¤ãã¤è©ä¾¡ããã¾ãããã£ã¼ã«ãåæååã¯ãããããä¸ã®ãã£ã¼ã«ãå¤ãåç §ãããã¨ã¯ã§ãã¾ãããããããä¸ã®ãã£ã¼ã«ãå¤ãåç §ãããã¨ã¯ã§ãã¾ãããéçã¡ã½ããã¯ãã¹ã¦äºåã«è¿½å ãããã¢ã¯ã»ã¹ãããã¨ãã§ãã¾ãããåæåããããã£ã¼ã«ãããä¸ã®ãã£ã¼ã«ããåç §ãã¦ããå ´åãå¼ã³åºãã¨æå¾ ããåä½ãããªããã¨ãããã¾ãã
ã¡ã¢:
ããã¯ãã©ã¤ãã¼ãéçãã£ã¼ã«ãã§ã¯ããéè¦ã§ããåæåããã¦ããªããã©ã¤ãã¼ããã£ã¼ã«ãã«ã¢ã¯ã»ã¹ããã¨ããã¨ããã®ãã©ã¤ãã¼ããã£ã¼ã«ããä¸ã§å®£è¨ããã¦ããã¨ãã¦ãã TypeError ãçºçããããã§ããï¼ãã©ã¤ãã¼ããã£ã¼ã«ãã宣è¨ããã¦ããªãå ´åã¯ãæ©æã« SyntaxError ã¨ãªãã¾ããï¼
éçåæåãããã¯ã¯ãã³ã¬ã¼ã¿ã¼ãæã¤ãã¨ãã§ãã¾ããï¼ã¯ã©ã¹èªèº«ã¯æã¤ãã¨ãã§ãã¾ãï¼ã
ä¾
>è¤æ°ã®ãããã¯
ä¸è¨ã³ã¼ãã¯ãéçåæåãããã¯ã¨éçãã£ã¼ã«ãåæååãæã¿è¾¼ãã ã¯ã©ã¹ã示ããã®ã§ãã åºåã¯ããããã¯ã¨ãã£ã¼ã«ããå®è¡é ã«è©ä¾¡ããããã¨ã示ãã¦ãã¾ãã
class MyClass {
static field1 = console.log("static field1");
static {
console.log("static block1");
}
static field2 = console.log("static field2");
static {
console.log("static block2");
}
}
// 'static field1'
// 'static block1'
// 'static field2'
// 'static block2'
ã¹ã¼ãã¼ã¯ã©ã¹ã®éçãªåæåã¯ããµãã¯ã©ã¹ã®åæåãããæåã«è¡ããããã¨ã«æ³¨æãã¦ãã ããã
this 㨠super ã®ä½¿ç¨
éçãããã¯å
ã® this ã¯ããã®ã¯ã©ã¹ã®ã³ã³ã¹ãã©ã¯ã¿ã¼ ãªãã¸ã§ã¯ããåç
§ãã¾ãã
ãã®ã³ã¼ãã¯ããããªãã¯éçãã£ã¼ã«ãã«ã¢ã¯ã»ã¹ããæ¹æ³ã示ãã¦ãã¾ãã
class A {
static field = "static field";
static {
console.log(this.field);
}
}
// 'static field'
super.property æ§æã static ãããã¯ã®ä¸ã§ä½¿ç¨ããã¨ãã¹ã¼ãã¼ã¯ã©ã¹ã®éçããããã£ãåç
§ãããã¨ãã§ãã¾ãã
class A {
static field = "static field";
}
class B extends A {
static {
console.log(super.field);
}
}
// 'static field'
ãã©ã¤ãã¼ãè¦ç´ ã¸ã®ã¢ã¯ã»ã¹
ä¸è¨ã¯ãã¯ã©ã¹å¤ã®ãªãã¸ã§ã¯ãããã¯ã©ã¹ã®ãã©ã¤ãã¼ãã¤ã³ã¹ã¿ã³ã¹ãã£ã¼ã«ãã«ã¢ã¯ã»ã¹ã許å¯ããä¾ã§ãï¼v8.dev blogããï¼ã
let getDPrivateField;
class D {
#privateField;
constructor(v) {
this.#privateField = v;
}
static {
getDPrivateField = (d) => d.#privateField;
}
}
console.log(getDPrivateField(new D("private"))); // 'private'
仿§æ¸
| Specification |
|---|
| ECMAScript® 2027 Language Specification> # prod-ClassStaticBlock> |
ãã©ã¦ã¶ã¼ã®äºææ§
é¢é£æ å ±
- ã¯ã©ã¹ã®ä½¿ç¨ã¬ã¤ã
- ã¯ã©ã¹
staticclass- Class static initialization blocks (v8.dev blog)
- ES2022 feature: class static initialization blocks (Dr. Axel Rauschmayer, 2021)