Кілька конструкторів у класі
1. Чому не можна мати кілька конструкторів
Якщо спробувати оголосити два конструктори в одному класі, буде синтаксична помилка:
class User {
constructor(name) {
this.name = name;
}
// Помилка: повторне оголошення конструктора
constructor(name, age) {
this.name = name;
this.age = age;
}
}
SyntaxError: A class may only have one constructor
2. Як правильно імітувати кілька конструкторів
Хоча прямого перевантаження немає, у JS можна реалізувати гнучкий конструктор різними способами:
Варіант 1: Перевірка аргументів усередині одного конструктора
class User {
constructor(name, age) {
if (typeof age === "undefined") {
this.name = name;
this.age = "unknown";
} else {
this.name = name;
this.age = age;
}
}
}
const u1 = new User("Alice");
const u2 = new User("Alex", 25);
console.log(u1); // { name: "Alice", age: "unknown" }
console.log(u2); // { name: "Alex", age: 25 }Цей підхід працює як "перевантаження за кількістю аргументів".
Варіант 2: Використати об'єкт параметрів
Коли аргументів багато, часто зручніше приймати об'єкт:
class User {
constructor({ name, age = null, email = null } = {}) {
this.name = name;
this.age = age;
this.email = email;
}
}
const u1 = new User({ name: "Alice" });
const u2 = new User({ name: "Alex", email: "alex@mail.com" });
console.log(u2);Читається зрозуміліше, особливо при великій кількості параметрів.
Варіант 3: Використати статичні фабричні методи
Це дуже популярний підхід у реальних проєктах: замість кількох конструкторів ти робиш різні "фабрики":
class User {
constructor(name, age) {
this.name = name;
this.age = age;
}
static fromName(name) {
return new User(name, null);
}
static fromObject(obj) {
return new User(obj.name, obj.age);
}
}
const u1 = User.fromName("Alice");
const u2 = User.fromObject({ name: "Alex", age: 30 });
console.log(u1, u2);Так ти можеш створювати "різні конструктори" під капотом, але фактично це різні статичні методи, що повертають екземпляр.
Варіант 4: Використати опціональні параметри + деструктуризацію
class Point {
constructor(x = 0, y = 0) {
this.x = x;
this.y = y;
}
}
const a = new Point(); // (0, 0)
const b = new Point(10); // (10, 0)
const c = new Point(5, 7); // (5, 7)Один конструктор, але три способи виклику, все легально й зручно.
Варіант 5: Успадкування (різні "типи" конструкторів)
Можна створювати різних нащадків, кожен зі своїм конструктором:
class User {
constructor(name) {
this.name = name;
}
}
class Admin extends User {
constructor(name, permissions) {
super(name);
this.permissions = permissions;
}
}
const u = new User("Alice");
const a = new Admin("Alex", ["edit", "delete"]);Таким чином "кілька конструкторів" реалізуються через ієрархію класів.
Підсумок
| Підхід | Чи допустимо | Приклад |
|---|---|---|
Кілька constructor() | Ні: синтаксична помилка | - |
| Один конструктор із перевіркою аргументів | Так | if (typeof age === "undefined") ... |
| Об'єкт параметрів | Так | constructor({ name, age }) {} |
| Фабричні методи | Так | User.fromName() / User.fromObject() |
| Успадкування | Так | class Admin extends User |
| Опціональні параметри | Так | constructor(x = 0, y = 0) |
Висновок:
У JS клас може містити лише один
constructor(), але ти можеш досягти тієї самої гнучкості за допомогою перевірок, фабрик або успадкування.
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.