éæåå§åå
åºçº¿
广æ³å¯ç¨
èª 2023å¹´3æ èµ·ï¼æ¤ç¹æ§å·²å¨ä¸»æµæµè§å¨ä¸å¾å°æ¯æï¼å¯å¨å¤§å¤æ°è®¾å¤åæµè§å¨çæ¬ä¸æ£å¸¸ä½¿ç¨ã
éæåå§ååæ¯å¨ class ä¸å£°æçãå®å
å«å¨ç±»åå§åè¿ç¨ä¸è¦æ±å¼çè¯å¥ãä¸ static 屿§ç¸æ¯ï¼å®å
许æ´çµæ´»çåå§åé»è¾ï¼ä¾å¦ä½¿ç¨ try...catch æç¨å个å¼è®¾ç½®å¤ä¸ªå段ãåå§åæ¯å¨å½å类声æçä¸ä¸æä¸è¿è¡çï¼å¹¶å¯è®¿é®ç§æç¶æï¼è¿å
许类ä¸å¨åä¸ä½ç¨åä¸å£°æçå
¶ä»ç±»æå½æ°å
±äº«å
¶ç§æå
ç´ ä¿¡æ¯ï¼ç±»ä¼¼äº C++ ä¸çâåå
âç±»ï¼ã
å°è¯ä¸ä¸
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"
è¯æ³
class ClassWithSIB {
static {
// â¦
}
}
æè¿°
å¦ææ²¡æéæåå§ååï¼å¯ä»¥éè¿å¨ç±»å£°æåè°ç¨éææ¹æ³æ¥å®ç°å¤æçéæåå§åï¼
class MyClass {
static init() {
// è¿éå
许访é®ç§æéæå段
}
}
MyClass.init();
ä¸è¿ï¼è¿ç§æ¹æ³ä¼åç±»çç¨æ·æ´é²ä¸ä¸ªå®ç°ç»èï¼init() æ¹æ³ï¼ãå¦ä¸æ¹é¢ï¼å¨ç±»å¤å£°æçä»»ä½åå§åé»è¾é½æ æ³è®¿é®ç§æéæå段ãéæåå§ååå
许å¨ç±»ä¸å£°æä»»æåå§åé»è¾ï¼å¹¶å¨ç±»æ±å¼çè¿ç¨ä¸æ§è¡ã
类主ä½ä¸å¯ä»¥å
å«ä»»ææ°éç 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() æä½¿ç¨ arguments 对象é½ä¼é æè¯æ³é误ã
è¿äºè¯å¥æ¯åæ¥æ§è¡çãå¨è¿äºä»£ç åä¸ä¸è½ä½¿ç¨ await æ yieldãï¼å°åå§åè¯å¥è§ä¸ºéå¼å°è£
å¨å½æ°ä¸ãï¼
éæä»£ç åçä½ç¨ååµå¥å¨ç±»ä¸»ä½çè¯æ³ä½ç¨åå ï¼å¹¶ä¸å¯ä»¥è®¿é®ç±»å 声æçç§æåç§°ï¼èä¸ä¼å¯¼è´è¯æ³é误ã
éæå段åå§åå¨åéæåå§å忝é个æ±å¼çãåå§ååå¯ä»¥å¼ç¨å ¶ä¸æ¹çåæ®µå¼ï¼ä½ä¸è½å¼ç¨å ¶ä¸æ¹çåæ®µå¼ãææéææ¹æ³é½ä¼äºå æ·»å å¹¶å¯ä»¥è®¿é®ï¼ä½å¦æè¿äºæ¹æ³å¼ç¨çåæ®µä½äºå½ååç䏿¹ï¼åè°ç¨è¿äºæ¹æ³æ¶å¯è½ä¼åºç°ä¸é¢æä¸ç¬¦çæ åµã
å¤å¿ï¼ 对äºç§æéæå段èè¨ï¼è¿ä¸ç¹æ´ä¸ºéè¦ï¼å ä¸ºè®¿é®æªåå§åçç§æåæ®µä¼æåº
TypeErrorï¼å³ä½¿è¯¥ç§æå段已å¨ä¸é¢å£°æãï¼å¦ææªå£°æç§æå段ï¼å伿åæåºSyntaxErrorãï¼
éæåå§ååå¯è½æ²¡æè£ 饰å¨ï¼ç±»æ¬èº«å¯è½æï¼ã
示ä¾
>å¤ä¸ªä»£ç å
ä¸é¢çä»£ç æ¼ç¤ºäºä¸ä¸ªå¸¦æéæåå§ååå交éçéæå段åå§åå¨çç±»ãè¾åºç»ææ¾ç¤ºï¼åååæ®µæ¯ææ§è¡é¡ºåºè¿è¡æ±å¼çã
class MyClass {
static field1 = console.log("éæå段 1");
static {
console.log("éæå 1");
}
static field2 = console.log("éæå段 2");
static {
console.log("éæå 2");
}
}
// 'éæå段 1'
// 'éæå 1'
// 'éæå段 2'
// 'éæå 2'
请注æï¼ç¶ç±»çä»»ä½éæåå§å齿¯å è¿è¡çï¼ç¶åææ¯åç±»çåå§åã
ä½¿ç¨ this å super
éæä»£ç åä¸ç this æ¯æç±»çæé 彿°å¯¹è±¡ãè¿æ®µä»£ç å±ç¤ºäºå¦ä½è®¿é®å
¬æéæå段ã
class A {
static field = "éæå段";
static {
console.log(this.field);
}
}
// 'éæå段'
super.property è¯æ³å¯å¨ static 代ç åä¸ä½¿ç¨ï¼ä»¥å¼ç¨ç¶ç±»çéæå±æ§ã
class A {
static field = "éæå段";
}
class B extends A {
static {
console.log(super.field);
}
}
// 'éæå段'
访é®ç§æå ç´
ä¸é¢ç示ä¾å±ç¤ºäºå¦ä½ä»ç±»ä¹å¤ç对象访é®ç±»çç§æå®ä¾å段ï¼ç¤ºä¾æ¥èª v8.dev å客ï¼ï¼
let getDPrivateField;
class D {
#privateField;
constructor(v) {
this.#privateField = v;
}
static {
getDPrivateField = (d) => d.#privateField;
}
}
console.log(getDPrivateField(new D("ç§æ"))); // 'ç§æ'
è§è
| è§è |
|---|
| ECMAScript® 2027 Language Specification> # prod-ClassStaticBlock> |
æµè§å¨å ¼å®¹æ§
åè§
- 使ç¨ç±»æå
- ç±»
staticclass- v8.dev ä¸çç±»çéæåå§åï¼2021ï¼
- ES2022 ç¹æ§ï¼ç±»çéæåå§å æ¥èª Axel Rauschmayer å士ï¼2021ï¼