constructor: инициализация
constructor— специальный метод класса (или функция-конструктор), вызываемый автоматически при создании нового экземпляра черезnewдля инициализации его начального состояния.
Зачем нужно
Конструктор — точка входа для инициализации каждого объекта: в нём задаются свойства экземпляра, устанавливаются начальные значения, производятся первичные проверки. Без него экземпляры были бы «пустыми» и требовали бы ручной настройки после создания.
Где используется
- Присвоение начальных значений полей объекта
- Валидация параметров при создании
- Вызов
superпри наследовании для инициализации родительского класса - Подписка на события или запуск побочных эффектов при создании
Синтаксис
class ClassName {
constructor(param1, param2) {
// инициализация
this.prop1 = param1;
this.prop2 = param2;
}
}
Примеры
Базовый класс
class User {
constructor(name, age) {
if (!name) throw new Error('Имя обязательно');
this.name = name;
this.age = age;
this.createdAt = new Date();
}
greet {
return `Привет, я ${this.name}`;
}
}
const user = new User('Иван', 30);
console.log(user.greet); // "Привет, я Иван"
console.log(user.createdAt); // Date объект
Наследование и super
class Animal {
constructor(name, sound) {
this.name = name;
this.sound = sound;
}
speak {
return `${this.name} говорит: ${this.sound}`;
}
}
class Dog extends Animal {
constructor(name) {
super(name, 'Гав'); // вызов конструктора Animal
this.tricks = ;
}
learn(trick) {
this.tricks.push(trick);
return this;
}
}
const dog = new Dog('Рекс');
dog.learn('сидеть').learn('лежать');
console.log(dog.speak); // "Рекс говорит: Гав"
console.log(dog.tricks); // ['сидеть', 'лежать']
Конструктор с параметрами по умолчанию
class Config {
constructor({ host = 'localhost', port = 3000, debug = false } = {}) {
this.host = host;
this.port = port;
this.debug = debug;
}
toString {
return `${this.host}:${this.port}`;
}
}
const dev = new Config({ port: 8080, debug: true });
const prod = new Config({ host: 'example.com' });
console.log(dev.toString()); // "localhost:8080"
console.log(prod.toString()); // "example.com:3000"
Функция-конструктор (до ES6)
function Point(x, y) {
this.x = x;
this.y = y;
}
Point.prototype.toString() = function {
return `(${this.x}, ${this.y})`;
};
const p = new Point(3, 4);
console.log(p.toString()); // "(3, 4)"
Частые ошибки
- Отсутствие
superперед обращением кthisв дочернем классе — вызываетReferenceError;superдолжен идти первым в конструкторе подкласса. - Возврат примитива из конструктора — конструктор должен возвращать объект или ничего; возврат примитива игнорируется.
- Дублирование логики в конструкторе — тяжёлую инициализацию (сетевые запросы, асинхронные операции) лучше выносить в фабричные функции или метод
init.