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.

Связанные темы

Ресурсы