æ¬é¡µé¢å°è¯¦ç»ä»ç»å ¬å ±å®ä¾å段ã
static
ãå ¬æå®ä¾å段åå¨äºç±»çæ¯ä¸ªå·²å建å®ä¾ä¸ãéè¿å£°æå ¬å ±å段ï¼å¯ä»¥ç¡®ä¿è¯¥å段å§ç»åå¨ï¼èä¸ç±»çå®ä¹ä¹æ´å èªææ¡£åï¼self-documentingï¼ã
å
Œ
±å®ä¾å段ä¼å¨åºç±»çæé æ¶ï¼æé 彿°ä¸»ä½è¿è¡ä¹åï¼æåç±»ç super()
è¿ååæ·»å å°å®ä¾ä¸ã没æåå§åå¨çåæ®µä¼è¢«åå§å为 undefined
ãä¸å±æ§ä¸æ ·ï¼å段åç§°ä¹å¯ä»¥è®¡ç®ã
const PREFIX = "prefix";
class ClassWithField {
field;
fieldWithInitializer = "å®ä¾å段";
[`${PREFIX}Field`] = "带åç¼å段";
}
const instance = new ClassWithField();
console.log(Object.hasOwn(instance, "field")); // true
console.log(instance.field); // undefined
console.log(instance.fieldWithInitializer); // "å®ä¾å段"
console.log(instance.prefixField); // "带åç¼å段"
åªå¨ç±»å®ä¹æ¶å¯¹è®¡ç®å段åè¿è¡ä¸æ¬¡æ±å¼ãè¿æå³çæ¯ä¸ªç±»æ»æ¯æä¸ç»åºå®çåæ®µåï¼ä¸¤ä¸ªå®ä¾ä¸è½éè¿è®¡ç®çåç§°æ¥æä¸åçåæ®µåã计ç®è¡¨è¾¾å¼ä¸ç this
æå类声ææå¤ä¸ä¸æç this
ï¼èå¼ç¨ç±»åä¼å¯¼è´ ReferenceError
ï¼å ä¸ºç±»å°æªåå§åã卿¤è¡¨è¾¾å¼ä¸ï¼await
å yield
æé¢æå·¥ä½ã
class C {
[Math.random()] = 1;
}
console.log(new C());
console.log(new C());
// 两个å®ä¾æ¥æç¸åçåæ®µåç§°
å¨å段åå§åå¨ä¸ï¼this
æåæ£å¨æå»ºçç±»å®ä¾ï¼è super
æååºç±»ç prototype
屿§ï¼å®å
å«åºç±»çå®ä¾æ¹æ³ï¼ä½ä¸å
å«å
¶å®ä¾å段ã
class Base {
baseField = "åºç±»å段";
anotherBaseField = this.baseField;
baseMethod() {
return "åºç±»æ¹æ³è¾åº";
}
}
class Derived extends Base {
subField = super.baseMethod();
}
const base = new Base();
const sub = new Derived();
console.log(base.anotherBaseField); // "åºç±»å段"
console.log(sub.subField); // "åºç±»æ¹æ³è¾åº"
æ¯æ¬¡å建æ°å®ä¾æ¶ï¼é½ä¼å¯¹å段åå§å表达å¼è¿è¡æ±å¼ãï¼å 为æ¯ä¸ªå®ä¾ç this
å¼é½ä¸åï¼æä»¥åå§å表达å¼å¯ä»¥è®¿é®ç¹å®äºå®ä¾ç屿§ï¼ã
class C {
obj = {};
}
const instance1 = new C();
const instance2 = new C();
console.log(instance1.obj === instance2.obj); // false
è¡¨è¾¾å¼æ¯åæ¥æ±å¼çãä¸è½å¨åå§å表达å¼ä¸ä½¿ç¨ await
æ yield
ãï¼å°åå§å表达å¼è§ä¸ºè¢«éå¼å°è£
å¨å½æ°ä¸ãï¼
ç±äºç±»çå®ä¾å段æ¯å¨åèªçæé 彿°è¿è¡ä¹åæ·»å çï¼å æ¤å¯ä»¥å¨æé 彿°ä¸è®¿é®å段çå¼ãç¶èï¼ç±äºæ´¾çç±»çå®ä¾å段æ¯å¨ super()
è¿ååå®ä¹çï¼å æ¤åºç±»çæé 彿°æ æ³è®¿é®æ´¾çç±»çåæ®µã
class Base {
constructor() {
console.log("åºç±»çæé 彿°ï¼", this.field);
}
}
class Derived extends Base {
field = 1;
constructor() {
super();
console.log("æ´¾çç±»çæ§å¶å½æ°ï¼", this.field);
this.field = 2;
}
}
const instance = new Derived();
// åºç±»çæé 彿°ï¼undefined
// æ´¾çç±»çæ§å¶å½æ°ï¼1
console.log(instance.field); // 2
åæ®µæ¯é个添å çãåæ®µåå§åå¨å¯ä»¥å¼ç¨å®ä¸é¢çåæ®µå¼ï¼ä½ä¸è½å¼ç¨å®ä¸é¢çåæ®µå¼ãææå®ä¾æ¹æ³åéææ¹æ³é½ä¼äºå æ·»å å¹¶å¯ä»¥è®¿é®ï¼ä½å¦æè¿äºæ¹æ³å¼ç¨çåæ®µä½äºæ£å¨åå§åçåæ®µï¼é£ä¹è°ç¨è¿äºæ¹æ³æ¶å¯è½ä¼åºç°ä¸é¢æä¸ç¬¦çæ åµã
class C {
a = 1;
b = this.c;
c = this.a + 1;
d = this.c + 1;
}
const instance = new C();
console.log(instance.d); // 3
console.log(instance.b); // undefined
夿³¨ï¼ è¿å¯¹ç§æå段æ´ä¸ºéè¦ï¼å ä¸ºè®¿é®æªåå§åçç§æåæ®µä¼æåº TypeError
ï¼å³ä½¿è¯¥ç§æå段已å¨ä¸é¢å£°æãï¼å¦ææªå£°æç§æå段ï¼å伿åæåº SyntaxError
ãï¼
ç±äºç±»å段æ¯ä½¿ç¨ [[DefineOwnProperty]]
è¯ä¹ï¼æ¬è´¨ä¸æ¯ Object.defineProperty()
ï¼æ·»å çï¼å æ¤æ´¾çç±»ä¸çåæ®µå£°æä¸ä¼è°ç¨åºç±»ä¸ç setterãè¿ç§è¡ä¸ºä¸åäºå¨æé 彿°ä¸ä½¿ç¨ this.field = â¦
ã
class Base {
set field(val) {
console.log(val);
}
}
class DerivedWithField extends Base {
field = 1;
}
const instance = new DerivedWithField(); // No log
class DerivedWithConstructor extends Base {
constructor() {
super();
this.field = 1;
}
}
const instance2 = new DerivedWithConstructor(); // æå° 1
夿³¨ï¼ å¨ç±»å段è§èæç»ç¡®å®ä¸º[[DefineOwnProperty]]
è¯ä¹ä¹åï¼å
æ¬ Babel å tscå¨å
ç大夿°è½¬è¯å¨é½å°ç±»å段转æ¢ä¸º DerivedWithConstructor
å½¢å¼ï¼è¿å¨ç±»å段è§èåä¹åé æäºä¸äºå¾®å¦çé误ã
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4