Shuningdek, biz usulni "prototype" ga emas, balki klassning funktsiyasiga tayinlashimiz mumkin. Bunday usullar statik deb nomlanadi.
Misol:
class User {
static staticMethod() {
alert(this === User);
}
}
User.staticMethod(); // true
Bu aslida uni funktsiya xususiyati sifatida tayinlash bilan bir xil boâladi:
class User {}
User.staticMethod = function () {
alert(this === User);
};
User.staticMethod(); // true
User.staticMethod() ichidagi this qiymati User klass konstruktoridir (ânuqta oldidagi obyektâ qoidasi).
Odatda, statik usullar klassga tegishli funktsiyalarni amalga oshirish uchun ishlatiladi, lekin uning biron bir alohida obyektiga emas.
Masalan, bizda Article obyektlari mavjud va ularni taqqoslash funktsiyasi zarur. Tabiiy tanlov quyidagicha Article.compare boâladi:
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("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
Bu yerda Article.compare maqolalarni âustidanâ taqqoslash vositasi sifatida turadi. Bu maqola usuli uchun emas, balki butun klass uchun.
Yana bir misol âfabrikaâ deb nomlangan usul boâlishi mumkin. Tasavvur qiling, bizga maqola yaratishning bir necha yoâli bor:
- Berilgan parametrlar boâyicha yaratish (
title,dateva hokazo). - Bugungi sana bilan boâsh maqola yarating.
- â¦yoki yana nimadir.
Birinchi usul konstruktor tomonidan amalga oshirilishi mumkin. Va ikkinchisi uchun biz klassning statik usulini yaratishimiz mumkin.
Article.createTodays() singari bu yerda:
class Article {
constructor(title, date) {
this.title = title;
this.date = date;
}
static createTodays() {
// eslab qoling, this = Article
return new this("Bugungi dayjest", new Date());
}
}
let article = Article.createTodays();
alert( article.title ); // Bugungi dayjest
Endi har safar bugungi dayjestni yaratishimiz kerak boâlsa, biz Article.createTodays() deb chaqirishimiz mumkin. Yana bir bor takrorlayman, bu maqola usuli emas, balki butun klassning usuli.
Maâlumotlar bazasi bilan bogâliq klasslarda statik usullar maâlumotlar bazasidan yozuvlarni qidirish/saqlash/olib tashlash uchun quyidagi kabi qoâllaniladi:
// Article - maqolalarni boshqarish uchun maxsus klass deb taxmin qilamiz
// maqolani olib tashlash uchun statik usul:
Article.remove({ id: 12345 });
Statik xususiyatlar
Statik xususiyatlar, odatdagi klass xususiyatlari singari ham mumkin:
class Article {
static publisher = "Oybek Zokhidov";
}
alert(Article.publisher); // Oybek Zokhidov
Bu Article ga toâgâridan-toâgâri tayinlash bilan bir xil
Article.publisher = "Oybek Zokhidov";
Statika va meros
Statika bu meros, biz Parent.method ga Child.metho" sifatida kirishimiz mumkin.
Masalan, quyidagi koddagi Animal.compare meros qilib olingan va Rabbit.compare sifatida undan foydalanish mumkin:
class Animal {
static planet = "Earth";
constructor(name, speed) {
this.speed = speed;
this.name = name;
}
run(speed = 0) {
this.speed += speed;
alert(`${this.name} ${this.speed} tezlikda yuguradi.`);
}
static compare(animalA, animalB) {
return animalA.speed - animalB.speed;
}
}
// Animal-dan meros
class Rabbit extends Animal {
hide() {
alert(`${this.name} bekinadi!`);
}
}
let rabbits = [
new Rabbit("White Rabbit", 10),
new Rabbit("Black Rabbit", 5)
];
rabbits.sort(Rabbit.compare);
rabbits[0].run(); // Black Rabbit 5 tezlikda yuguradi.
Endi biz Rabbit.compare ni meros qilib olingan Animal.compare chaqiriladi taxmin qilishimiz mumkin.
Bu qanday ishlaydi? Shunga qaramay, prototiplardan foydalanish. Siz allaqachon taxmin qilganingizdek, kengaytmalar Rabbit ga [[Prototype]] ning havolasini Animal ga beradi.
Shunday qilib, Rabbit funktsiyasi endi Animal funktsiyasini egallaydi. Va Animal funktsiyasi odatda Function.prototype ga tegishli [[Prototype]] ga ega, chunki u hech narsani kengaytirmaydi.
Mana, buni tekshirib koâraylik:
class Animal {}
class Rabbit extends Animal {}
// statik xususiyatlar va usullar uchun
alert(Rabbit.__proto__ === Animal); // true
// va keyingi qadam - bu Function.prototype
alert(Animal.__proto__ === Function.prototype); // true
// bu obyekt usullari uchun "oddiy" prototip zanjiriga qo'shimcha ravishda
alert(Rabbit.prototype.__proto__ === Animal.prototype);
Shunday qilib, Rabbit Animal ning barcha statik usullaridan foydalanish imkoniyatiga ega.
Xulosa
Statik usullar aniq klass misoli bilan bogâliq boâlmagan, misol uchun mavjud boâlishni talab qilmaydigan, aksincha Article.compare singari umuman klassga tegishli boâlgan funksiyalar uchun ishlatiladi â taqqoslash uchun umumiy usul ikkita maqola.
Statik xususiyatlar, masalan, misol bilan bogâliq boâlmagan, klass darajasidagi maâlumotlarni saqlashni xohlaganimizda ishlatiladi.
Sintaksis:
class MyClass {
static property = ...;
static method() {
...
}
}
Bu texnik jihatdan klassning oâziga tayinlash bilan bir xil:
MyClass.property = ...
MyClass.method = ...
Statik xususiyatlar meros qilib olinadi.
Texnik, uchun class B extends A klass prototipi B oâzi A ishora uzaytiradi: B.[[Prototype]] = A. Demak, B da biror maydon topilmasa, qidiruv A da davom etadi.

Izohlar
<code>yorlig'ini ishlating, bir nechta satrlar uchun - ularni<pre>yorlig'i bilan o'rab qo'ying, 10 satrdan ortiq bo'lsa - sandbox (plnkr, jsbin, codepenâ¦)