ã¯ã©ã¹å ¨ä½ã«ã¡ã½ãããå²ãå½ã¦ããã¨ãã§ãã¾ãããã®ãããªã¡ã½ãã㯠static(éç) ã¨å¼ã°ãã¾ãã
ã¯ã©ã¹å®£è¨ã®ä¸ã§ã¯ã次ã®ããã« static ãã¼ã¯ã¼ããä»ãã¾ãã
class User {
static staticMethod() {
alert(this === User);
}
}
User.staticMethod(); // true
ããã¯ãå®éã«ã¯ããããã£ã¨ãã¦ç´æ¥å²ãå½ã¦ãã®ã¨åããã¨ããã¾ãã:
class User {}
User.staticMethod = function () {
alert(this === User);
};
User.staticMethod(); // true
User.staticMethod() å
ã® this ã®å¤ã¯ã¯ã©ã¹ã³ã³ã¹ãã©ã¯ã¿ User èªèº«(âãããã®åã®ãªãã¸ã§ã¯ãâ ã«ã¼ã«)ã§ãã
é常 static ã¡ã½ããã¯ãã¯ã©ã¹ã«ã¯å±ããããç¹å®ã®ãªãã¸ã§ã¯ãã«ã¯å±ããªã颿°ãå®è£ ããã®ã«ä½¿ç¨ããã¾ãã
ä¾ãã°ãArticle ãªãã¸ã§ã¯ãããããããããæ¯è¼ããããã®é¢æ°ãå¿
è¦ã¨ãã¾ãã
èªç¶ãªè§£æ±ºçã¯ãéçã¡ã½ãã Article.compare ã追å ãããã¨ã§ãã:
class Article {
constructor(title, date) {
this.title = title;
this.date = date;
}
static compare(articleA, articleB) {
return articleA.date - articleB.date;
}
}
// usage
let articles = [
new Article("Mind", new Date(2019, 1, 1)),
new Article("Body", new Date(2019, 0, 1)),
new Article("JavaScript", new Date(2019, 11, 1))
];
articles.sort(Article.compare);
alert( articles[0].title ); // Body
ããã§ã¯ãArticle.compare ã¯è¨äºãæ¯è¼ããææ®µã¨ãã¦ãè¨äºã® âä¸ä½â ã«ãã¾ããè¨äºã®ã¡ã½ããã¨è¨ãããã¯ã¯ã©ã¹å
¨ä½ã®ã¡ã½ããã§ãã
å¥ã®ä¾ã¯ããããã âãã¡ã¯ããªã¼â ã¡ã½ããã§ãã
è¨äºã®ä½æã«ã¯è¤æ°ã®æ¹æ³ãå¿ è¦ã§ã:
- ä¸ãããããã©ã¡ã¼ã¿(
title,dateãªã©)ã«ãã使 - 仿¥ã®æ¥ä»ã®ç©ºã®è¨äºã®ä½æ
- â¦
æåã®æ¹æ³ã¯ã³ã³ã¹ãã©ã¯ã¿ã§å®è£ ãããã¨ãã§ãã¾ããããã¦ã2 ã¤ç®ã®æ¹æ³ã¨ãã¦ã¯ã¯ã©ã¹ã®éçã¡ã½ãããä½ããã¨ãã§ãã¾ãã
ããã§ã® Article.createTodays() ãè¦ã¦ãã ãã:
class Article {
constructor(title, date) {
this.title = title;
this.date = date;
}
static createTodays() {
// æãåºãã¦ãã ãã, this = Article
return new this("Today's digest", new Date());
}
}
let article = Article.createTodays();
alert( article.title ); // Todays digest
ããã§ä»æ¥ã®ãã¤ã¸ã§ã¹ãã使ããå¿
è¦ããããã³ã«ãArticle.createTodays() ãå¼ã¹ã¾ããæ¹ãã¦è¨ãã¾ãããããã¯è¨äºã®ã¡ã½ããã§ã¯ãªããã¯ã©ã¹å
¨ä½ã®ã¡ã½ããã§ãã
éçã¡ã½ããã¯ã次ã®ããã«ããã¼ã¿ãã¼ã¹é¢é£ã®ã¯ã©ã¹ã§ãã¼ã¿ãã¼ã¹ã®æ¤ç´¢/ä¿å/åé¤ã®ããã«ã使ç¨ããã¾ãã:
// Article ã¯è¨äºã管çããããã®ç¹å¥ãªã¯ã©ã¹ã¨ä»®å®ãã¾ã
// è¨äºãåé¤ããããã® static ã¡ã½ãã:
Article.remove({ id: 12345 });
éçããããã£
éçããããã£ãå¯è½ã§ãé常ã®ã¯ã©ã¹ããããã£ã¨åãããã«è¦ãã¾ãããå
é ã« static ãä»ãã¾ãã
class Article {
static publisher = "Ilya Kantor";
}
alert(Article.publisher); // Ilya Kantor
ããã¯ç´æ¥ Article ã«ä»£å
¥ããã®ã¨åãã§ãã:
Article.publisher = "Ilya Kantor";
éçããããã£ã¨ã¡ã½ããã®ç¶æ¿
éçããããã£ã¨ã¡ã½ããã¯ç¶æ¿ããã¾ãã
ä¾ãã°ã以ä¸ã®ã³ã¼ãã® Animal.compare 㨠Animal.planet ã¯ç¶æ¿ãããRabbit.compare 㨠Rabbit.planet ã¨ãã¦ã¢ã¯ã»ã¹å¯è½ã§ãã
class Animal {
static planet = "Earth";
constructor(name, speed) {
this.speed = speed;
this.name = name;
}
run(speed = 0) {
this.speed += speed;
alert(`${this.name} runs with speed ${this.speed}.`);
}
static compare(animalA, animalB) {
return animalA.speed - animalB.speed;
}
}
// Inherit from Animal
class Rabbit extends Animal {
hide() {
alert(`${this.name} hides!`);
}
}
let rabbits = [
new Rabbit("White Rabbit", 10),
new Rabbit("Black Rabbit", 5)
];
rabbits.sort(Rabbit.compare);
rabbits[0].run(); // Black Rabbit runs with speed 5.
alert(Rabbit.planet); // Earth
Rabbit.compare ãå¼ã³åºãã¨ãç¶æ¿ããã Animal.compare ãå¼ã³åºããã¾ãã
ããã¯ã©ã®ããã«æ©è½ãã¦ããã§ãããï¼ãã§ã«æ¨æ¸¬ããããããã¾ããããextends ãã¾ã Rabbit ã« Animal ã¸ã®åç
§ãæã¤ [[Prototype]] ãä¸ãã¾ãã
ãããã£ã¦, Rabbit extends Animal 㯠2 ã¤ã® [[Prototype]] ã®åç
§ã使ãã¾ã:
Rabbit颿°ã¯ ãããã¿ã¤ãçã«Animal颿°ãç¶æ¿ãã¦ãã¾ããRabbit.prototypeã¯ãããã¿ã¤ãçã«Animal.prototypeãç¶æ¿ãã¦ãã¾ãã
çµæãç¶æ¿ã¯é常ã®ãã®ã¨éçãªã¡ã½ãã両æ¹ã§æ©è½ãã¾ãã
ããã§ãããã確èªãã¾ããã:
class Animal {}
class Rabbit extends Animal {}
// éç
alert(Rabbit.__proto__ === Animal); // true
// é常ã®ã¡ã½ãã
alert(Rabbit.prototype.__proto__ === Animal.prototype); // true
ãµããª
éçã¡ã½ããã¯ãå ·ä½çãªã¯ã©ã¹ã¤ã³ã¹ã¿ã³ã¹ã«é¢é£ããæ©è½ãã¤ã³ã¹ã¿ã³ã¹ãåå¨ãããã¨ãå¿ è¦ããæ©è½ã§ã¯ãªãããããã¯ã©ã¹å ¨ä½ã«å±ãã¦ããæ©è½ã®ããã«ä½¿ç¨ããã¾ãã
ä¾ãã°ãæ¯è¼ç¨ã®ã¡ã½ãã Article.compare(article1, article2) ãããã¡ã¯ããªã¼ã¡ã½ãã Article.createTodays() ã§ãã
ãããã¯ã¯ã©ã¹å®£è¨ã®ä¸ã§ static ã¨è¨ããã¼ã¯ã¼ãã§ã©ãã«ä»ãããã¾ãã
éçããããã£ã¯ãã¯ã©ã¹ã¬ãã«ã®ãã¼ã¿ãæ ¼ç´ããã¨ãã«ä½¿ç¨ãããã¤ã³ã¹ã¿ã³ã¹ã«ãã¤ã³ãããã¾ããã
æ§æã¯æ¬¡ã®éãã§ã:
class MyClass {
static property = ...;
static method() {
...
}
}
ããã¯æè¡çã«ã¯ãã¯ã©ã¹èªèº«ã¸ã®ä»£å ¥ã¨åãã§ã:
MyClass.property = ...
MyClass.method = ...
éçããããã£ã¯ç¶æ¿ããã¾ãã
class B extends A ã®å ´åãã¯ã©ã¹ B èªä½ã®ãããã¿ã¤ã㯠A ãæãã¾ãã: B.[[Prototype]] = Aããããã£ã¦ãB ã®ä¸ã«ãã£ã¼ã«ããè¦ã¤ãããªãå ´åã¯ãæ¤ç´¢ã¯ A ã®ä¸ã§ç¶è¡ããã¾ãã
ã³ã¡ã³ã
<code>ã¿ã°ã使ã£ã¦ãã ãããè¤æ°è¡ã®å ´åã¯<pre>ãã10è¡ãè¶ ããå ´åã«ã¯ãµã³ãããã¯ã¹ã使ã£ã¦ãã ãã(plnkr, JSBin, codepenâ¦)ã