Class static initialization blocks
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를 í¬í¨íê±°ë ë¨ì¼ ê°ìì ì¬ë¬ íë를 ì¤ì íë ì´ê¸°í ë±ì ê°ë¥íê² í©ëë¤.
ì´ê¸°íë íì¬ í´ëì¤ì ì ì¸ ì»¨í ì¤í¸ìì íë¼ì´ë¹ ìíì ëí í¹ë³í ê¶íì¼ë¡ ìíë©ëë¤. ì´ë ì ì ë¸ë¡ì ì¬ì©íì¬ ì¸ì¤í´ì¤ íë¼ì´ë¹ íëê° ìë í´ëì¤ì ê°ì ë²ììì ì ì¸ë ë¤ë¥¸ í´ëì¤ ëë í¨ì ê°ì ì 보를 ê³µì í ìë ììì ì미í©ëë¤. (C++ì "friend" í´ëì¤ì ì ì¬)
ìëí´ ë³´ê¸°
class ClassWithStaticInitializationBlock {
static staticProperty1 = "Property 1";
static staticProperty2;
static {
this.staticProperty2 = "Property 2";
}
}
console.log(ClassWithStaticInitializationBlock.staticProperty1);
// Expected output: "Property 1"
console.log(ClassWithStaticInitializationBlock.staticProperty2);
// Expected output: "Property 2"
구문
static { /* ⦠*/ }
ì¤ëª
í´ëì¤ë í´ëì¤ ë³¸ë¬¸ì static {} ì´ê¸°í ë¸ë¡ì ì¼ë§ë ì§ ê°ì§ ì ììµëë¤.
ì´ë¤ì ì ì¸ë ììëë¡ ì¸í°ë¦¬ë¸ë ì ì íë ì´ëì
ë¼ì´ì ì í¨ê» ê³ì°ë©ëë¤.
super í´ëì¤ì ì ì ì´ê¸°íë íì í´ëì¤ë³´ë¤ 먼ì ìíë©ëë¤.
ì ì ë¸ë¡ ë´ë¶ì ì ì¸ë ë³ìì ë²ìë í´ë¹ ë¸ë¡ì ëí ë¡ì»¬ì
ëë¤.
static {} ì´ê¸°í ë¸ë¡ìì ì ì¸ë var, function, const ëë letì í´ë¹ ë¸ë¡ì ëí´ ë¡ì»¬ì´ë¯ë¡ ë¸ë¡ì 모ë var ì ì¸ì í¸ì´ì¤í¸ ëì§ ììµëë¤.
var y = "ì¸ë¶ y";
class A {
static field = "ë´ë¶ y";
static {
var y = this.field;
}
}
// ì ì ë¸ë¡ìì ì ìë varë í¸ì´ì¤í°ëì§ ìì
console.log(y);
// > 'ì¸ë¶ y'
ì ì ë¸ë¡ ë´ë¶ì thisë í´ëì¤ì ìì±ì ê°ì²´ë¥¼ 참조í©ëë¤.
super.<property>ë super í´ëì¤ì ìì±ì ì¡ì¸ì¤íë ë° ì¬ì©í ì ììµëë¤.
ê·¸ë¬ë í´ëì¤ ì ì ì´ê¸°í ë¸ë¡ìì super()를 í¸ì¶íê±°ë í´ëì¤ ìì±ì í¨ìì ì¸ìì ì ê·¼íë ¤ê³ ìëíë ê²ì 구문 ì¤ë¥ë¼ë ê²ì ììëì¸ì.
ì ì ë¸ë¡ì ë²ìë í´ëì¤ ë³¸ë¬¸ì lexical scope ë´ì ì¤ì²©ëì´ í´ëì¤ì íë¼ì´ë¹ ì¸ì¤í´ì¤ ë³ìì ì ê·¼í ì ììµëë¤.
ì ì ì´ê¸°í ë¸ë¡ìë ë°ì½ë ì´í°ê° ìì ì ììµëë¤. (í´ëì¤ ìì²´ë ìì ì ìì)
ìì
>ë¤ì¤ ë¸ë¡
ìë ì½ëë ì ì ì´ê¸°í ë¸ë¡ê³¼ ì¸í°ë¦¬ë¸ë ì ì íë ì´ëì ë¼ì´ì ê° ìë í´ëì¤ë¥¼ ë³´ì¬ì¤ëë¤. ì¶ë ¥ì ë¸ë¡ê³¼ íëê° ì¤í ììëë¡ ê³ì°ëììì ë³´ì¬ì¤ëë¤.
class MyClass {
static field1 = console.log("íë1 í¸ì¶ë¨");
static {
console.log("1ë² ì ì í´ëì¤ ë¸ë¡ í¸ì¶ë¨");
}
static field2 = console.log("íë2 í¸ì¶ë¨");
static {
console.log("2ë² ì ì í´ëì¤ ë¸ë¡ í¸ì¶ë¨");
}
}
/*
> "íë1 í¸ì¶ë¨"
> "1ë² ì ì í´ëì¤ ë¸ë¡ í¸ì¶ë¨"
> "íë2 í¸ì¶ë¨"
> "2ë² ì ì í´ëì¤ ë¸ë¡ í¸ì¶ë¨"
*/
super í´ëì¤ì ì ì ì´ê¸°íë íì í´ëì¤ë³´ë¤ 먼ì ìíë©ëë¤.
thisì super ì¬ì©í기
ì ì ë¸ë¡ ë´ë¶ì thisë í´ëì¤ì ìì±ì ê°ì²´ë¥¼ 참조í©ëë¤.
ì´ ì½ëë í¼ë¸ë¦ ì ì íëì ì ê·¼íë ë°©ë²ì ë³´ì¬ì¤ëë¤.
class A {
static field = "ì ì íë";
static {
console.log(this.field);
}
}
super.propertyë static ë¸ë¡ ë´ìì super í´ëì¤ì ìì±ì 참조íë ë° ì¬ì©í ì ììµëë¤.
ì¬ê¸°ìë ìëì ê°ì´ ì ì ìì±ì´ í¬í¨ë©ëë¤.
class A {
static fieldA = "A.fieldA";
}
class B extends A {
static {
console.log(super.fieldA);
// 'A.fieldA'
}
}
íë¼ì´ë¹ íëì ì ê·¼í기
ìëì ìì ë í´ëì¤ ì¸ë¶ì ê°ì²´ìì í´ëì¤ì íë¼ì´ë¹ ê°ì²´ì ëí ì¡ì¸ì¤ ê¶íì ë¶ì¬íë ë°©ë²ì ë³´ì¬ì¤ëë¤. (v8.dev blog ë¸ë¡ê·¸ì ìì ).
let getDPrivateField;
class D {
#privateField;
constructor(v) {
this.#privateField = v;
}
static {
getDPrivateField = (d) => d.#privateField;
}
}
getDPrivateField(new D("private"));
// > private
ì 2ì í´ê²°ì±
ES13 ì´ì ìë ì ì ì´ê¸°í를 ìíí기 ìí´ ë¤ë¥¸ ìì± ë¤ìì í¸ì¶ëë ì ì ë©ìë를 ì¬ì©íê±°ë í´ëì¤ ì¸ë¶ì ìë ì´ê¸°í ë©ìë를 ì¬ì©íë ë³µì¡í ì´ê¸°í를 ì§ííìµëë¤.
ë ê²½ì° ëª¨ë ì ê·¼ ë°©ìì´ ì°ìíì§ìê³ í´ëì¤ì íë¼ì´ë¹ ë©ìëì ëí ì ê·¼ ê¶íì ë¶ì¬íëê²ì´ ìëììµëë¤.
ëª ì¸ì
| Specification |
|---|
| ECMAScript® 2027 Language Specification> # prod-ClassStaticBlock> |
ë¸ë¼ì°ì í¸íì±
ê°ì´ 보기
- Class static initialization blocks (v8.dev blog)
- ES2022 feature: class static initialization blocks (2ality.com blog)
- Classes
super()- Object.prototype.constructor