static
åºçº¿
广æ³å¯ç¨
èª 2016å¹´3æ èµ·ï¼æ¤ç¹æ§å·²å¨ä¸»æµæµè§å¨ä¸å¾å°æ¯æï¼å¯å¨å¤§å¤æ°è®¾å¤åæµè§å¨çæ¬ä¸æ£å¸¸ä½¿ç¨ã
static å
³é®åå®ä¹äºéææ¹æ³æåæ®µï¼æéæåå§ååï¼æå
³è¿ç§ç¨æ³çæ´å¤ä¿¡æ¯ï¼è¯·åé
龿¥ï¼ãéæå±æ§ä¸è½å¨ç±»çå®ä¾ä¸ç´æ¥è®¿é®ãç¸åï¼å®ä»¬æ¯å¨ç±»æ¬èº«ä¸è¢«è®¿é®çã
éææ¹æ³é常æ¯å®ç¨å½æ°ï¼å¦å建æå é对象ç彿°ï¼èéæå±æ§åéç¨äºç¼åãåºå®é ç½®æå ¶ä»ä¸éè¦è·¨å®ä¾å¤å¶çæ°æ®ã
夿³¨ï¼å¨ç±»çä¸ä¸æä¸ï¼MDN Web ææ¡£å 容交æ¿ä½¿ç¨å±æ§ååæ®µè¿ä¸¤ä¸ªæ¯è¯ã
å°è¯ä¸ä¸
class ClassWithStaticMethod {
static staticProperty = "someValue";
static staticMethod() {
return "static method has been called.";
}
static {
console.log("Class static initialization block called");
}
}
console.log(ClassWithStaticMethod.staticProperty);
// Expected output: "someValue"
console.log(ClassWithStaticMethod.staticMethod());
// Expected output: "static method has been called."
è¯æ³
class ClassWithStatic {
static staticField;
static staticFieldWithInitializer = value;
static staticMethod() {
// â¦
}
}
è¿æä¸äºé¢å¤çè¯æ³éå¶ï¼
- éæå±æ§ï¼åæ®µææ¹æ³ï¼çåç§°ä¸è½æ¯
prototypeã - ç±»åæ®µï¼éææå®ä¾ï¼çåç§°ä¸è½æ¯
constructorã
æè¿°
æ¬é¡µä»ç»ç±»çå ¬æéæå±æ§ï¼å æ¬éææ¹æ³ãéæè®¿é®å¨åéæå段ã
- å ³äºç§æéæç¹æ§ï¼è¯·åé ç§æå ç´ ã
- å ³äºå®ä¾ç¹æ§ï¼è¯·åé æ¹æ³å®ä¹ãgetterãsetter åå ¬æç±»å段ã
å
¬æéæç¹æ§æ¯ä½¿ç¨ static å
³é®å声æçãå¨ç±»æ±å¼æ¶ï¼ä½¿ç¨ [[DefineOwnProperty]] è¯ä¹ï¼æ¬è´¨ä¸æ¯ Object.defineProperty()ï¼å°å®ä»¬æ·»å å°ç±»æé 彿°ä¸ãç±»æé 彿°ä¼å次访é®å®ä»¬ã
éææ¹æ³é常æ¯å®ç¨å½æ°ï¼ä¾å¦å建æå éå®ä¾ç彿°ãå½ä½ 叿ä¸ä¸ªåæ®µå¨æ¯ä¸ªç±»ä¸åªåå¨ä¸æ¬¡ï¼è䏿¯å¨ä½ åå»ºçæ¯ä¸ªç±»å®ä¾ä¸é½å卿¶ï¼å ¬æéæåæ®µå°±å¾æç¨ãè¿å¯¹ç¼åãåºå®é ç½®æå ¶ä»ä¸éè¦å¨å®ä¾é´å¤å¶çæ°æ®é常æç¨ã
éæå段åç§°å¯ä»¥è®¡ç®ã计ç®è¡¨è¾¾å¼ä¸ç this 弿¯ç±»å®ä¹å¨å´ç thisï¼èå¼ç¨ç±»çåç§°åä¼å¯¼è´ ReferenceErrorï¼å ä¸ºç±»å°æªåå§åã卿¤è¡¨è¾¾å¼ä¸ï¼await å yield æé¢æå·¥ä½ã
éæå段å¯ä»¥æåå§åå¨ã没æåå§åå¨çéæå段å°è¢«åå§å为 undefinedãå
¬æéæå段ä¸ä¼å¨åç±»ä¸éæ°åå§åï¼ä½å¯ä»¥éè¿ååé¾è®¿é®ã
class ClassWithStaticField {
static staticField;
static staticFieldWithInitializer = "éæå段";
}
class SubclassWithStaticField extends ClassWithStaticField {
static subStaticField = "åç±»çåæ®µ";
}
console.log(Object.hasOwn(ClassWithStaticField, "staticField")); // true
console.log(ClassWithStaticField.staticField); // undefined
console.log(ClassWithStaticField.staticFieldWithInitializer); // "éæå段"
console.log(SubclassWithStaticField.staticFieldWithInitializer); // "éæå段"
console.log(SubclassWithStaticField.subStaticField); // "åç±»çåæ®µ"
å¨å段åå§åå¨ä¸ï¼this æåå½åç±»ï¼ä¹å¯éè¿å
¶å称访é®ï¼ï¼super æååºç±»æé 彿°ã
class ClassWithStaticField {
static baseStaticField = "åºç±»éæå段";
static anotherBaseStaticField = this.baseStaticField;
static baseStaticMethod() {
return "åºç±»éææ¹æ³è¾åº";
}
}
class SubClassWithStaticField extends ClassWithStaticField {
static subStaticField = super.baseStaticMethod();
}
console.log(ClassWithStaticField.anotherBaseStaticField); // "åºç±»éæå段"
console.log(SubClassWithStaticField.subStaticField); // "åºç±»éææ¹æ³è¾åº"
è¡¨è¾¾å¼æ¯åæ¥æ±å¼çãä¸è½å¨åå§å表达å¼ä¸ä½¿ç¨ await æ yieldãï¼å°åå§å表达å¼è§ä¸ºéå¼å°è£
å¨å½æ°ä¸ãï¼
éæå段åå§åå¨åéæåå§å忝é个æ±å¼çãåæ®µåå§åå¨å¯ä»¥å¼ç¨å ¶ä¸çåæ®µå¼ï¼ä½ä¸è½å¼ç¨å ¶ä¸çåæ®µå¼ãææéææ¹æ³é½ä¼äºå æ·»å å¹¶å¯è¢«è®¿é®ï¼ä½å¦æå®ä»¬å¼ç¨çåæ®µå¨è¢«åå§åçåæ®µç䏿¹ï¼åè°ç¨å®ä»¬æ¶å¯è½ä¼åºç°ä¸é¢æä¸ç¬¦çæ åµã
夿³¨ï¼å¯¹äºç§æéæå段èè¨ï¼è¿ä¸ç¹æ´ä¸ºéè¦ï¼å ä¸ºè®¿é®æªåå§åçç§æåæ®µä¼æåº TypeErrorï¼å³ä½¿è¯¥ç§æå段已å¨ä¸é¢å£°æãï¼å¦ææªå£°æç§æå段ï¼å伿åæåº SyntaxErrorãï¼
示ä¾
>å¨ç±»ä¸ä½¿ç¨éææå
ä¸é¢çä¾å说æäºè¿å ç¹ï¼
- éææ¹æ³å¦ä½å¨ç±»ä¸å®ç°ã
- å ·æéææåçç±»ï¼å¯ä»¥è¢«åç±»åã
- ä»ä¹æ åµä¸éææ¹æ³å¯ä»¥è°ç¨ï¼ä»ä¹æ åµä¸ä¸è½è°ç¨ã
class Triple {
static customName = "ä¸åå¨";
static description = "æå¯ä»¥è®©ä½ æä¾ç任使°å为å®çä¸å";
static calculate(n = 1) {
return n * 3;
}
}
class SquaredTriple extends Triple {
static longDescription;
static description = "æå¯ä»¥è®©ä½ æä¾ç任使°å为å
¶ä¸åçå¹³æ¹";
static calculate(n) {
return super.calculate(n) * super.calculate(n);
}
}
console.log(Triple.description); // 'æå¯ä»¥è®©ä½ æä¾ç任使°å为å®çä¸å'
console.log(Triple.calculate()); // 3
console.log(Triple.calculate(6)); // 18
let tp = new Triple();
console.log(SquaredTriple.calculate(3)); // 81ï¼ä¸ä¼åç¶ç±»å®ä¾åçå½±åï¼
console.log(SquaredTriple.description); // 'æå¯ä»¥è®©ä½ æä¾ç任使°å为å
¶ä¸åçå¹³æ¹'
console.log(SquaredTriple.longDescription); // undefined
console.log(SquaredTriple.customName); // 'ä¸åå¨'
// æåºé误ï¼å 为 calculate() æ¯éææåï¼è䏿¯å®ä¾æåã
console.log(tp.calculate()); // 'tp.calculate 䏿¯ä¸ä¸ªå½æ°'
ä»å¦ä¸ä¸ªéææ¹æ³è°ç¨éææå
为äºå¨åä¸ç±»çå¦ä¸ä¸ªéææ¹æ³ä¸è°ç¨éææ¹æ³æå±æ§ï¼å¯ä»¥ä½¿ç¨ this å
³é®åã
class StaticMethodCall {
static staticProperty = "éæå±æ§";
static staticMethod() {
return `éææ¹æ³å${this.staticProperty}被è°ç¨`;
}
static anotherStaticMethod() {
return `ä»å¦å¤ä¸ä¸ªéææ¹æ³èæ¥ç${this.staticMethod()}`;
}
}
StaticMethodCall.staticMethod();
// 'éææ¹æ³åéæå±æ§è¢«è°ç¨'
StaticMethodCall.anotherStaticMethod();
// 'ä»å¦å¤ä¸ä¸ªéææ¹æ³èæ¥çéææ¹æ³åéæå±æ§è¢«è°ç¨'
ä»ç±»çæé 彿°åå ¶ä»æ¹æ³ä¸è°ç¨éææå
éææåä¸è½ä½¿ç¨ this å
³é®åä»ééææ¹æ³ç´æ¥è®¿é®éææåãä½ éè¦ä½¿ç¨ç±»åæ¥è°ç¨ classname.static_method_name() æ CLASSNAME.STATIC_PROPERTY_NAMEï¼æå° this.constructor.STATIC_Method_NAME() æ this.constructor.STATIC_PROPERTY_NAME æ¥ä½ä¸º constructor ç屿§è°ç¨ã
class StaticMethodCall {
constructor() {
console.log(StaticMethodCall.staticProperty); // 'éæå±æ§'
console.log(this.constructor.staticProperty); // 'éæå±æ§'
console.log(StaticMethodCall.staticMethod()); // 'éææ¹æ³å·²è°ç¨'
console.log(this.constructor.staticMethod()); // 'éææ¹æ³å·²è°ç¨'
}
static staticProperty = "éæå±æ§";
static staticMethod() {
return "éææ¹æ³å·²è°ç¨";
}
}
è§è
| è§è |
|---|
| ECMAScript® 2027 Language Specification> # sec-class-definitions> |
æµè§å¨å ¼å®¹æ§
åè§
- 使ç¨ç±»æå
- ç±»
- éæåå§åå
class