static
Baseline
åºãå©ç¨å¯è½
ãã®æ©è½ã¯åºãå®è£ ããã¦ãããå¤ãã®ãã¼ã¸ã§ã³ã®ç«¯æ«ããã©ã¦ã¶ã¼ã§åä½ãã¾ãã2016å¹´3æä»¥éããã¹ã¦ã®ãã©ã¦ã¶ã¼ã§å©ç¨å¯è½ã§ãã
static ãã¼ã¯ã¼ãã¯ãã¯ã©ã¹ã«éçã¡ã½ãããéçãã£ã¼ã«ããã¾ãã¯éçåæåãããã¯ãå®ç¾©ãã¾ãï¼ãã®ä½¿ãæ¹ã«ã¤ãã¦è©³ããã¯ããªã³ã¯å
ãåç
§ãã¦ãã ããï¼ã éçããããã£ã¯ãã¯ã©ã¹ã®ã¤ã³ã¹ã¿ã³ã¹ããç´æ¥ã¢ã¯ã»ã¹ãããã¨ã¯ã§ãã¾ããã代ããã«ãã¯ã©ã¹èªä½ã«å¯¾ãã¦ã¢ã¯ã»ã¹ãã¾ãã
éçã¡ã½ããã¯å¤ãã®å ´åããªãã¸ã§ã¯ãã®çæãè¤è£½ãè¡ã颿°ãªã©ã®ã¦ã¼ãã£ãªãã£é¢æ°ã§ããéçããããã£ã¯ãã£ãã·ã¥ãåºå®çãªæ§æããã®ä»ã®åã¤ã³ã¹ã¿ã³ã¹ã«è¤è£½ããå¿ è¦ã®ãªããã¼ã¿ã§ãã
ã¡ã¢: ã¯ã©ã¹ã®æèã«ããã¦ã MDN Web Docs ã®ã³ã³ãã³ãã§ã¯ããããã£ã¨ãã£ã¼ã«ãã¨ããç¨èªãåçã®ãã®ã¨ãã¦ä½¿ç¨ãã¦ãã¾ãã
試ãã¦ã¿ã¾ããã
class ClassWithStaticMethod {
static staticProperty = "someValue";
static staticMethod() {
return "éçã¡ã½ãããå¼ã³åºããã¾ããã";
}
static {
console.log("ã¯ã©ã¹éçåæåãããã¯ãå¼ã³åºããã¾ã");
}
}
console.log(ClassWithStaticMethod.staticProperty);
// äºæ³ãããçµæ: "someValue"
console.log(ClassWithStaticMethod.staticMethod());
// äºæ³ãããçµæ: "éçã¡ã½ãããå¼ã³åºããã¾ããã"
æ§æ
class ClassWithStatic {
static staticField;
static staticFieldWithInitializer = value;
static staticMethod() {
// â¦
}
}
ãã以å¤ã«ãæ§æä¸ã®å¶ç´ãããã¾ãã
- éçããããã£ï¼ãã£ã¼ã«ãã¾ãã¯ã¡ã½ããï¼ã®ååã
prototypeã¨ãããã¨ã¯ã§ãã¾ããã - ã¯ã©ã¹ãã£ã¼ã«ãï¼éçã¾ãã¯ã¤ã³ã¹ã¿ã³ã¹ï¼ã®ååã
constructorã¨ãããã¨ã¯ã§ãã¾ããã
解説
ãã®ãã¼ã¸ã§ã¯ãéçã¡ã½ãããéçã¢ã¯ã»ãµãéçãã£ã¼ã«ããå«ããã¯ã©ã¹ã®ãããªãã¯éçããããã£ãç´¹ä»ãã¾ãã
- ãã©ã¤ãã¼ããªéçæ©è½ã«ã¤ãã¦ã¯ããã©ã¤ãã¼ãè¦ç´ ãåç §ãã¦ãã ããã
- ã¤ã³ã¹ã¿ã³ã¹ã®æ©è½ã«ã¤ãã¦ã¯ãã¡ã½ããå®ç¾©ãã²ãã¿ã¼ãã»ãã¿ã¼ããããªãã¯ã¯ã©ã¹ãã£ã¼ã«ããåç §ãã¦ãã ããã
ãããªãã¯éçæ©è½ã¯ã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ï¼ã使ç¨ãããã¨ã¯ã§ãã¾ãããï¼åæååå¼ã¯æé»ã«é¢æ°ã«å
ã¾ãã¦ããã¨èãã¦ãã ããï¼ã
éçãã£ã¼ã«ãåæååã¨éçåæåãããã¯ã¯ã 1 ã¤ãã¤è©ä¾¡ããã¾ãããã£ã¼ã«ãåæååã¯ãããããä¸ã®ãã£ã¼ã«ãå¤ãåç §ãããã¨ã¯ã§ãã¾ãããããããä¸ã®ãã£ã¼ã«ãå¤ãåç §ãããã¨ã¯ã§ãã¾ãããéçã¡ã½ããã¯ãã¹ã¦äºåã«è¿½å ãããã¢ã¯ã»ã¹ãããã¨ãã§ãã¾ãããåæåããããã£ã¼ã«ãããä¸ã®ãã£ã¼ã«ããåç §ãã¦ããå ´åãå¼ã³åºãã¨æå¾ ããåä½ãããªããã¨ãããã¾ãã
ã¡ã¢:
ããã¯ãã©ã¤ãã¼ãéçãã£ã¼ã«ãã§ã¯ããéè¦ã§ããåæåããã¦ããªããã©ã¤ãã¼ããã£ã¼ã«ãã«ã¢ã¯ã»ã¹ããã¨ããã¨ããã®ãã©ã¤ãã¼ããã£ã¼ã«ããä¸ã§å®£è¨ããã¦ããã¨ãã¦ãã TypeError ãçºçããããã§ããï¼ãã©ã¤ãã¼ããã£ã¼ã«ãã宣è¨ããã¦ããªãå ´åã¯ãæ©æã« SyntaxError ã¨ãªãã¾ããï¼
ä¾
>ã¯ã©ã¹ã§ã®éçã¡ã³ãã¼ã®ä½¿ç¨
次ã®ä¾ã¯ããã¤ãã®ãã¨ã説æãã¦ãã¾ãã
- éçã¡ã³ãã¼ï¼ã¡ã½ããã¾ãã¯ããããã£ï¼ãã¯ã©ã¹ã§ã©ã®ããã«å®ç¾©ãããã
- éçã¡ã³ãã¼ãæã¤ã¯ã©ã¹ããµãã¯ã©ã¹ãä½ããã
- éçã¡ã³ãã¼ãã©ãå¼ã³åºãã¦ãã©ãå¼ã³åºããªãã
class Triple {
static customName = "Tripler";
static description = "I triple any number you provide";
static calculate(n = 1) {
return n * 3;
}
}
class SquaredTriple extends Triple {
static longDescription;
static description = "I square the triple of any number you provide";
static calculate(n) {
return super.calculate(n) * super.calculate(n);
}
}
console.log(Triple.description); // 'I triple any number you provide'
console.log(Triple.calculate()); // 3
console.log(Triple.calculate(6)); // 18
const tp = new Triple();
console.log(SquaredTriple.calculate(3)); // 81 (not affected by parent's instantiation)
console.log(SquaredTriple.description); // 'I square the triple of any number you provide'
console.log(SquaredTriple.longDescription); // undefined
console.log(SquaredTriple.customName); // 'Tripler'
// ãã㯠calculate() ãã¤ã³ã¹ã¿ã³ã¹ã¡ã³ãã¼ã§ã¯ãªãéçã¡ã³ãã¼ãªã®ã§ãä¾å¤ãçºç
console.log(tp.calculate()); // 'tp.calculate is not a function'
éçã¡ã³ãã¼ã®å¥ãªéçã¡ã½ããããã®å¼ã³åºã
åãã¯ã©ã¹å
ã®éçã¡ã½ããã¾ãã¯ããããã£ãéçã¡ã½ããããå¼ã³åºãã«ã¯ã this ãã¼ã¯ã¼ãã使ãã¾ãã
class StaticMethodCall {
static staticProperty = "static property";
static staticMethod() {
return `Static method and ${this.staticProperty} has been called`;
}
static anotherStaticMethod() {
return `${this.staticMethod()} from another static method`;
}
}
StaticMethodCall.staticMethod();
// 'Static method and static property has been called'
StaticMethodCall.anotherStaticMethod();
// 'Static method and static property has been called from another static method'
ã¯ã©ã¹ã®ã³ã³ã¹ãã©ã¯ã¿ã¼ãä»ã®ã¡ã½ããããã®éçã¡ã½ããã®å¼ã³åºã
éçã¡ã½ããã¯éçã§ã¯ãªãã¡ã½ããã® this ãã¼ã¯ã¼ãã使ç¨ãã¦ç´æ¥ã¢ã¯ã»ã¹ãããã¨ãã§ãã¾ãããå¼ã³åºãã«ã¯ã¯ã©ã¹åã使ç¨ã㦠ã¯ã©ã¹å.éçã¡ã½ããå() / ã¯ã©ã¹å.éçããããã£å ã®ããã«ãããã constructor ããããã£ã®ã¡ã½ããã¨ã㦠this.constructor.éçã¡ã½ããå() / this.constructor.éçããããã£å ã®ããã«ãã¦ãã ããã
class StaticMethodCall {
constructor() {
console.log(StaticMethodCall.staticProperty); // 'static property'
console.log(this.constructor.staticProperty); // 'static property'
console.log(StaticMethodCall.staticMethod()); // 'éçã¡ã½ãããå¼ã³åºããã¾ããã'
console.log(this.constructor.staticMethod()); // 'éçã¡ã½ãããå¼ã³åºããã¾ããã'
}
static staticProperty = "static property";
static staticMethod() {
return "éçã¡ã½ãããå¼ã³åºããã¾ããã";
}
}
仿§æ¸
| 仿§æ¸ |
|---|
| ECMAScript® 2027 Language Specification > # sec-class-definitions > |