Ðи Ñакож можемо пÑиÑвоÑÑи меÑод ÑамÑй ÑÑнкÑÑÑ ÐºÐ»Ð°ÑÑ. Ð¢Ð°ÐºÑ Ð¼ÐµÑоди називаÑÑÑÑÑ ÑÑаÑиÑними.
У клаÑÑ Ð¿ÐµÑед ними ÑÑоÑÑÑ ÐºÐ»ÑÑове Ñлово static, напÑиклад:
class User {
static staticMethod() {
alert(this === User);
}
}
User.staticMethod(); // true
ФакÑиÑно Ñе Ñе ж Ñаме, Ñо й безпоÑеÑеднÑо пÑиÑвоÑÑи меÑод Ñк влаÑÑивÑÑÑÑ ÑÑнкÑÑÑ:
class User { }
User.staticMethod = function() {
alert(this === User);
};
User.staticMethod(); // true
ÐнаÑеннÑм 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.createToday(). ÐÐ½Ð¾Ð²Ñ Ð¶ Ñаки, Ñе не меÑод конкÑеÑÐ½Ð¾Ñ ÑÑаÑÑÑ, а меÑод ÑÑлого клаÑÑ.
СÑаÑиÑÐ½Ñ Ð¼ÐµÑоди Ñакож викоÑиÑÑовÑÑÑÑÑÑ Ð² клаÑÐ°Ñ , Ñо повâÑÐ·Ð°Ð½Ñ Ð· Ð±Ð°Ð·Ð¾Ñ Ð´Ð°Ð½Ð¸Ñ , Ð´Ð»Ñ Ð¿Ð¾ÑÑкÑ/збеÑеженнÑ/Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð·Ð°Ð¿Ð¸ÑÑв Ñз бази Ð´Ð°Ð½Ð¸Ñ , напÑиклад:
// пÑипÑÑÑимо, Ñо Article -- Ñе ÑпеÑÑалÑний ÐºÐ»Ð°Ñ Ð´Ð»Ñ ÐºÐµÑÑÐ²Ð°Ð½Ð½Ñ ÑÑаÑÑÑми
// ÑÑаÑиÑний меÑод Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ ÑÑаÑÑÑ:
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 Ñа Animal.planet Ñ ÐºÐ¾Ð´Ñ Ð½Ð¸Ð¶Ñе ÑÑпадковÑÑÑÑÑÑ Ñа доÑÑÑÐ¿Ð½Ñ Ñк Rabbit.compare Ñа Rabbit.planet:
class Animal {
static planet = "ÐемлÑ";
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;
}
}
// Inherit from 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.
alert(Rabbit.planet); // ÐемлÑ
ТепеÑ, коли ми викликаÑмо Rabbit.compare, бÑде викликано ÑÑпадкований Animal.compare.
Як Ñе пÑаÑÑÑ? ÐÐ½Ð¾Ð²Ñ Ð¶ Ñаки, викоÑиÑÑовÑÑÑи пÑоÑоÑипи. Як ви вже могли здогадаÑиÑÑ, extends Ð´Ð°Ñ Rabbit поÑÐ¸Ð»Ð°Ð½Ð½Ñ [[Prototype]] на Animal.
ÐÑже, Rabbit extends Animal ÑÑвоÑÑÑ Ð´Ð²Ð° поÑÐ¸Ð»Ð°Ð½Ð½Ñ [[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â¦)