ÐÑ Ñакже можем пÑиÑвоиÑÑ Ð¼ÐµÑод ÑÐ°Ð¼Ð¾Ð¼Ñ ÐºÐ»Ð°ÑÑÑ. Такие меÑÐ¾Ð´Ñ Ð½Ð°Ð·ÑваÑÑÑÑ ÑÑаÑиÑеÑкими.
РобÑÑвление клаÑÑа они добавлÑÑÑÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÐºÐ»ÑÑевого Ñлова static, напÑимеÑ:
class User {
static staticMethod() {
alert(this === User);
}
}
User.staticMethod(); // true
ÐÑо ÑакÑиÑеÑки Ñо же Ñамое, ÑÑо пÑиÑвоиÑÑ Ð¼ÐµÑод напÑÑмÑÑ ÐºÐ°Ðº ÑвойÑÑво ÑÑнкÑии:
class User { }
User.staticMethod = function() {
alert(this === User);
};
ÐнаÑением this пÑи вÑзове User.staticMethod() ÑвлÑеÑÑÑ Ñам конÑÑÑÑкÑÐ¾Ñ ÐºÐ»Ð°ÑÑа User (пÑавило «обÑÐµÐºÑ Ð´Ð¾ ÑоÑки»).
ÐбÑÑно ÑÑаÑиÑеÑкие меÑÐ¾Ð´Ñ Ð¸ÑполÑзÑÑÑÑÑ Ð´Ð»Ñ ÑеализаÑии ÑÑнкÑий, коÑоÑÑе бÑдÑÑ Ð¿ÑинадлежаÑÑ ÐºÐ»Ð°ÑÑÑ Ð² Ñелом, но не какомÑ-либо его конкÑеÑÐ½Ð¾Ð¼Ñ Ð¾Ð±ÑекÑÑ.
ÐвÑÑÐ¸Ñ Ð½Ðµ оÑÐµÐ½Ñ Ð¿Ð¾Ð½ÑÑно? СейÑÐ°Ñ Ð²Ñе вÑÑÐ°Ð½ÐµÑ Ð½Ð° Ñвои меÑÑа.
ÐапÑимеÑ, еÑÑÑ Ð¾Ð±ÑекÑÑ ÑÑаÑей Article, и нÑжна ÑÑнкÑÐ¸Ñ Ð´Ð»Ñ Ð¸Ñ
ÑÑавнениÑ.
ÐÑÑеÑÑвенное ÑеÑение â ÑделаÑÑ Ð´Ð»Ñ ÑÑого ÑÑаÑиÑеÑкий меÑод Article.compare:
class Article {
constructor(title, date) {
this.title = title;
this.date = date;
}
static compare(articleA, articleB) {
return articleA.date - articleB.date;
}
}
// иÑполÑзование
let articles = [
new Article("HTML", new Date(2019, 1, 1)),
new Article("CSS", new Date(2019, 0, 1)),
new Article("JavaScript", new Date(2019, 11, 1))
];
articles.sort(Article.compare);
alert( articles[0].title ); // CSS
ÐдеÑÑ Ð¼ÐµÑод Article.compare ÑÑÐ¾Ð¸Ñ Â«Ð½Ð°Ð´Â» ÑÑаÑÑÑми, как ÑÑедÑÑво Ð´Ð»Ñ Ð¸Ñ
ÑÑавнениÑ. ÐÑо меÑод не оÑделÑной ÑÑаÑÑи, а вÑего клаÑÑа.
ÐÑÑгим пÑимеÑом Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ñак назÑваемÑй «ÑабÑиÑнÑй» меÑод.
Скажем, нам нÑжно неÑколÑко ÑпоÑобов ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑÑаÑÑи:
- Создание ÑеÑез заданнÑе паÑамеÑÑÑ (
title,dateи Ñ. д.). - Создание пÑÑÑой ÑÑаÑÑи Ñ ÑегоднÑÑней даÑой.
- â¦Ð¸Ð»Ð¸ как-Ñо еÑÑ.
ÐеÑвÑй ÑпоÑоб Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ñеализован ÑеÑез конÑÑÑÑкÑоÑ. Ð Ð´Ð»Ñ Ð²ÑоÑого можно иÑполÑзоваÑÑ ÑÑаÑиÑеÑкий меÑод клаÑÑа.
Такой как Article.createTodays() в ÑледÑÑÑем пÑимеÑе:
class Article {
constructor(title, date) {
this.title = title;
this.date = date;
}
static createTodays() {
// помним, ÑÑо this = Article
return new this("СегоднÑÑний дайджеÑÑ", new Date());
}
}
let article = Article.createTodays();
alert( article.title ); // СегоднÑÑний дайджеÑÑ
ТепеÑÑ ÐºÐ°Ð¶Ð´Ñй Ñаз, когда нам нÑжно ÑоздаÑÑ ÑегоднÑÑний дайджеÑÑ, нÑжно вÑзÑваÑÑ Article.createTodays(). ÐÑÑ Ñаз, ÑÑо не меÑод одной ÑÑаÑÑи, а меÑод вÑего клаÑÑа.
СÑаÑиÑеÑкие меÑÐ¾Ð´Ñ Ñакже иÑполÑзÑÑÑÑÑ Ð² клаÑÑÐ°Ñ , оÑноÑÑÑÐ¸Ñ ÑÑ Ðº базам даннÑÑ , Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка/ÑÐ¾Ñ ÑанениÑ/ÑÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð²Ñ Ð¾Ð¶Ð´ÐµÐ½Ð¸Ð¹ в Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ , напÑимеÑ:
// пÑедположим, ÑÑо Article - ÑÑо ÑпеÑиалÑнÑй клаÑÑ Ð´Ð»Ñ ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ ÑÑаÑÑÑми
// ÑÑаÑиÑеÑкий меÑод Ð´Ð»Ñ ÑÐ´Ð°Ð»ÐµÐ½Ð¸Ñ ÑÑаÑÑи по id:
Article.remove({id: 12345});
СÑаÑиÑеÑкие меÑÐ¾Ð´Ñ Ð¼Ð¾Ð³ÑÑ Ð²ÑзÑваÑÑÑÑ Ð´Ð»Ñ ÐºÐ»Ð°ÑÑов, но не Ð´Ð»Ñ Ð¾ÑделÑнÑÑ Ð¾Ð±ÑекÑов.
ÐапÑимеÑ. Ñакой код не бÑÐ´ÐµÑ ÑабоÑаÑÑ:
// ...
article.createTodays(); /// Error: article.createTodays is not a function
СÑаÑиÑеÑкие ÑвойÑÑва
СÑаÑиÑеÑкие ÑвойÑÑва Ñакже возможнÑ, они вÑглÑдÑÑ ÐºÐ°Ðº ÑвойÑÑва клаÑÑа, но Ñ static в наÑале:
class Article {
static publisher = "ÐлÑÑ ÐанÑоÑ";
}
alert( Article.publisher ); // ÐлÑÑ ÐанÑоÑ
ÐÑо Ñо же Ñамое, ÑÑо и пÑÑмое пÑиÑваивание Article:
Article.publisher = "ÐлÑÑ ÐанÑоÑ";
ÐаÑледование ÑÑаÑиÑеÑÐºÐ¸Ñ ÑвойÑÑв и меÑодов
СÑаÑиÑеÑкие ÑвойÑÑва и меÑÐ¾Ð´Ñ Ð½Ð°ÑледÑÑÑÑÑ.
ÐапÑимеÑ, меÑод Animal.compare в коде ниже наÑледÑеÑÑÑ Ð¸ доÑÑÑпен как Rabbit.compare:
class Animal {
constructor(name, speed) {
this.speed = speed;
this.name = name;
}
run(speed = 0) {
this.speed += speed;
alert(`${this.name} Ð±ÐµÐ¶Ð¸Ñ Ñо ÑкоÑоÑÑÑÑ ${this.speed}.`);
}
static compare(animalA, animalB) {
return animalA.speed - animalB.speed;
}
}
// ÐаÑледÑÐµÑ Ð¾Ñ Animal
class Rabbit extends Animal {
hide() {
alert(`${this.name} пÑÑÑеÑÑÑ!`);
}
}
let rabbits = [
new Rabbit("ÐелÑй кÑолик", 10),
new Rabbit("ЧÑÑнÑй кÑолик", 5)
];
rabbits.sort(Rabbit.compare);
rabbits[0].run(); // ЧÑÑнÑй кÑолик Ð±ÐµÐ¶Ð¸Ñ Ñо ÑкоÑоÑÑÑÑ 5.
ÐÑ Ð¼Ð¾Ð¶ÐµÐ¼ вÑзваÑÑ Rabbit.compare, пÑи ÑÑом бÑÐ´ÐµÑ Ð²Ñзван ÑнаÑледованнÑй Animal.compare.
Ðак ÑÑо ÑабоÑаеÑ? Снова Ñ Ð¸ÑполÑзованием пÑоÑоÑипов. Ðак Ð²Ñ Ñже могли пÑедположиÑÑ, extends даÑÑ Rabbit ÑÑÑÐ»ÐºÑ [[Prototype]] на Animal.
Так ÑÑо Rabbit extends Animal ÑоздаÑÑ Ð´Ð²Ðµ ÑÑÑлки на пÑоÑоÑип:
- ФÑнкÑиÑ
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â¦)