Skip to main content

Кілька конструкторів у класі

1. Чому не можна мати кілька конструкторів

Якщо спробувати оголосити два конструктори в одному класі, буде синтаксична помилка:

javascript
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: Перевірка аргументів усередині одного конструктора

javascript
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: Використати об'єкт параметрів

Коли аргументів багато, часто зручніше приймати об'єкт:

javascript
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: Використати статичні фабричні методи

Це дуже популярний підхід у реальних проєктах: замість кількох конструкторів ти робиш різні "фабрики":

javascript
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: Використати опціональні параметри + деструктуризацію

javascript
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: Успадкування (різні "типи" конструкторів)

Можна створювати різних нащадків, кожен зі своїм конструктором:

javascript
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(), але ти можеш досягти тієї самої гнучкості за допомогою перевірок, фабрик або успадкування.

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.