å ¬æç±»å段
åºçº¿
广æ³å¯ç¨
èª 2022å¹´9æ èµ·ï¼æ¤ç¹æ§å·²å¨ä¸»æµæµè§å¨ä¸å¾å°æ¯æï¼å¯å¨å¤§å¤æ°è®¾å¤åæµè§å¨çæ¬ä¸æ£å¸¸ä½¿ç¨ã
å ¬æå段æ¯å¯ç¼è¾ã坿䏾åå¯é ç½®ç屿§ãå æ¤ï¼ä¸åäºç§æå¯¹åºå¼ï¼private counterpartï¼çæ¯ï¼å®ä»¬åä¸ååçç»§æ¿ã
è¯æ³
class ClassWithField {
instanceField;
instanceFieldWithInitializer = "å®ä¾å段";
static staticField;
static staticFieldWithInitializer = "éæå段";
}
è¿æä¸äºé¢å¤çè¯æ³éå¶ï¼
- éæå±æ§ï¼åæ®µææ¹æ³ï¼çåç§°ä¸è½æ¯
prototypeã - ç±»åæ®µï¼éææå®ä¾ï¼çåç§°ä¸è½æ¯
constructorã
æè¿°
æ¬é¡µé¢å°è¯¦ç»ä»ç»å ¬å ±å®ä¾å段ã
- æå
³å
Œ
±éæå段ï¼è¯·åé
staticã - å ³äºç§æå段ï¼è¯·åé ç§æå ç´ ã
- å ¬å ±æ¹æ³è¯·åè§æ¹æ³çå®ä¹ã
- æå ³å ¬å ±è®¿é®å¨ï¼è¯·åé getter å setterã
å ¬æå®ä¾å段åå¨äºç±»çæ¯ä¸ªå·²å建å®ä¾ä¸ãéè¿å£°æå ¬å ±å段ï¼å¯ä»¥ç¡®ä¿è¯¥å段å§ç»åå¨ï¼èä¸ç±»çå®ä¹ä¹æ´å èªææ¡£åï¼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
示ä¾
>使ç¨ç±»å段
ç±»åæ®µä¸è½ä¾èµäºæé 彿°çåæ°ï¼å æ¤å段åå§åå¨é常ä¼å¨æ¯ä¸ªå®ä¾ä¸é½æ±åºç¸åçå¼ï¼é¤éåä¸è¡¨è¾¾å¼æ¯æ¬¡æ±åºçå¼é½ä¸åï¼ä¾å¦ Date.now() æå¯¹è±¡åå§åå¨ï¼ã
class Person {
name = nameArg; // nameArg 卿é 彿°çä½ç¨åå¤
constructor(nameArg) {}
}
class Person {
// Person çææå®ä¾ä¼æç¸åç name
name = "Dragomir";
}
ä¸è¿ï¼å³ä½¿å£°æä¸ä¸ªç©ºçç±»åæ®µä¹æ¯æå¥½å¤çï¼å 为è¿è¡¨æäºå段çåå¨ï¼ä»èå è®¸ç±»åæ£æ¥ç¨åºå人类读è éæåæç±»çç»æã
class Person {
name;
age;
constructor(name, age) {
this.name = name;
this.age = age;
}
}
ä¸é¢ç代ç çä¼¼éå¤ï¼ä½èèä¸ä¸ this è¢«å¨ææ´æ¹çæ
åµï¼æç¡®çåæ®µå£°ææ¸
æ¥å°è¡¨æäºåªäºå段ä¸å®ä¼åºç°å¨å®ä¾ä¸ã
class Person {
name;
age;
constructor(properties) {
Object.assign(this, properties);
}
}
ç±äºåå§å卿¯å¨åºç±»æ§è¡å®æåæ±å¼çï¼å æ¤ä½ å¯ä»¥è®¿é®ç±åºç±»æé 彿°å建ç屿§ã
class Person {
name;
age;
constructor(name, age) {
this.name = name;
this.age = age;
}
}
class Professor extends Person {
name = `${this.name} ææ`;
}
console.log(new Professor("Radev", 54).name); // "Radev ææ"
è§è
| è§è |
|---|
| ECMAScript® 2027 Language Specification > # prod-FieldDefinition > |
æµè§å¨å ¼å®¹æ§
åè§
- 使ç¨ç±»æå
- ç±»
- ç§æå ç´
class- ææ JS ç±»å ç´ çè¯ä¹
- v8.dev ç«ç¹ä¸å ³äºå ¬æåç§æç±»åæ®µçæç«