Як додати метод у класі?
1. Звичайний (публічний) метод
Метод, доступний у всіх екземплярів класу:
class User {
constructor(name) {
this.name = name;
}
greet() {
console.log(`Hi, ${this.name}!`);
}
}
const u = new User("Alice");
u.greet(); // Hi, Alice!Такі методи автоматично додаються в User.prototype,
тобто розділяються між усіма екземплярами (а не створюються заново для кожного об'єкта).
2. Додавання методу після оголошення класу
Ти можеш додати метод у прототип класу вже після його оголошення, вручну:
class User {
constructor(name) {
this.name = name;
}
}
// Додаємо метод пізніше
User.prototype.sayBye = function () {
console.log(`${this.name} каже: бувай!`);
};
const u = new User("Alice");
u.sayBye(); // Alice каже: бувай!Це працює, бо під капотом class, це просто функція з prototype.
3. Статичний метод (static)
Такий метод викликається безпосередньо у класу, а не в екземпляра:
class MathUtils {
static square(n) {
return n * n;
}
}
console.log(MathUtils.square(5)); // 25Екземпляри (
new MathUtils()) не мають доступу доstatic-методів.
4. Геттер і сеттер
Використовуються, щоб "маскувати" властивості під методи:
class Product {
constructor(price) {
this._price = price;
}
get price() {
return this._price + " $";
}
set price(value) {
if (value < 0) throw new Error("Ціна не може бути від'ємною");
this._price = value;
}
}
const p = new Product(1000);
console.log(p.price); // "1000 $"
p.price = 1500;
console.log(p.price); // "1500 $"Під час доступу
p.priceфактично викликаєтьсяget price(), під час присвоєнняp.price = ..., викликаєтьсяset price().
5. Приватні методи (#methodName)
Недоступні ззовні, лише всередині класу:
class Account {
#logBalance() {
console.log(`Поточний баланс: ${this.balance}`);
}
constructor(balance) {
this.balance = balance;
this.#logBalance(); // можна викликати лише звідси
}
}
const acc = new Account(500);
// acc.#logBalance(); Помилка: приватний метод6. Методи-поля (стрілкові функції)
Якщо хочеш, щоб метод зберігав контекст this, можна оголосити його як поле:
class Button {
label = "Click me";
handleClick = () => {
console.log(`Clicked: ${this.label}`);
};
}
const b = new Button();
b.handleClick(); // Clicked: Click meТакі методи не втрачають this, навіть якщо передати їх як колбек:
setTimeout(b.handleClick, 1000); // все працює коректноПідсумок
| Тип методу | Синтаксис | Доступність | Особливості |
|---|---|---|---|
| Звичайний | method() {} | Через екземпляр | Спільний для всіх екземплярів |
| Статичний | static method() {} | Через сам клас | Не видно в екземплярів |
| Геттер / сеттер | get name() {}, set name(v) {} | Як властивість | Можна контролювати доступ |
| Приватний | #method() {} | Лише всередині класу | Повна інкапсуляція |
| Поле-метод (стрілка) | method = () => {} | Через екземпляр | Не втрачає this |
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.