Клас - синтаксис для створення об'єктів з однаковою структурою й поведінкою. Під капотом це звичайна функція-конструктор з прототипом, але запис читабельніший.
class Product {
static count = 0; // статичне поле: належить класу, а не екземпляру
currency = 'UAH'; // поле екземпляра зі значенням за замовчуванням
#discount = 0; // приватне поле
constructor(name, price) {
this.name = name;
this.price = price;
Product.count++;
}
get finalPrice() { // гетер: читається як властивість
return this.price - this.#discount;
}
applyDiscount(amount) { // метод: спільний для всіх екземплярів через прототип
this.#discount = amount;
return this;
}
static fromJson(data) { // статичний метод: фабрика
return new Product(data.name, data.price);
}
}
const p = new Product('Книга', 500).applyDiscount(50);
p.finalPrice; // 450
Product.count; // 1
Успадкування:
class DigitalProduct extends Product {
constructor(name, price, url) {
super(name, price); // обов'язково до звернення до this
this.url = url;
}
toString() {
return `${this.name} (${this.url})`;
}
}
Правила, на яких часто помиляються:
super()передthisу конструкторі класу-нащадка - інакшеReferenceError: Must call super constructor ... before accessing 'this';- клас без
newвикликати не можна:Product('x')даєTypeError: Class constructor Product cannot be invoked without 'new'; - класи не піднімаються як функції: використати клас до його оголошення -
ReferenceError(тимчасова мертва зона, як уlet); - тіло класу завжди в суворому режимі;
- методи не прив'язані до екземпляра:
const fn = p.applyDiscount; fn(10)втратитьthis. Для обробників подій використовують стрілкову функцію в полі класу чиbind.
Поля чи присвоєння в конструкторі: поля класу оголошують структуру об'єкта в одному місці й створюються до виконання тіла конструктора (для нащадка - одразу після super()).
Статичний блок static { ... } виконується один раз при оголошенні класу - для складної ініціалізації статичних полів.
Коли клас доречний: об'єкти з власним станом і поведінкою, ієрархії, з якими працює бібліотека (веб-компоненти, класи помилок). Для простих даних достатньо об'єктного літерала, а для поведінки без стану - звичайних функцій.