Чем constructor отличается от ngOnInit?angular-27

Оба метода используются в Angular компонентах, но имеют принципиально разные назначения и время выполнения.

Constructor

export class MyComponent {
  constructor() {
    // Код конструктора
  }
}
  1. Назначение:

    • Это стандартный классовый конструктор TypeScript (не Angular-специфичный)
    • Основная цель - инициализация полей класса
  2. Когда выполняется:

    • В момент создания экземпляра класса (до любого Angular-специфичного кода)
  3. Особенности:

    • Еще не доступны Input-свойства (они undefined)
    • Не рекомендуется выполнять сложную логику или обращаться к DOM
    • Angular внедряет зависимости именно через конструктор

ngOnInit

export class MyComponent implements OnInit {
  ngOnInit() {
    // Код инициализации
  }
}
  1. Назначение:

    • Angular-специфичный хук жизненного цикла
    • Основная цель - выполнение инициализационной логики компонента
  2. Когда выполняется:

    • После первого ngOnChanges (когда Input-свойства инициализированы)
    • Один раз за жизненный цикл компонента (если не происходит destroy/create)
  3. Особенности:

    • Input-свойства уже доступны и содержат значения
    • Можно безопасно обращаться к DOM (хотя лучше использовать ngAfterViewInit для работы с ViewChild)
    • Идеальное место для вызова сервисов, загрузки данных

Ключевые отличия

Характеристика constructor ngOnInit
Тип Классовый конструктор Хук жизненного цикла
Время выполнения Очень рано После инициализации Input-свойств
Доступ к Inputs Нет Да
Angular-специфика Нет Да
Рекомендуемое использование Внедрение зависимостей Инициализационная логика

Практический пример

@Component({
  selector: 'app-example',
  template: ````{{value}}````
})
export class ExampleComponent implements OnInit {
  @Input() value: string;

  constructor(private service: DataService) {
    // this.value будет undefined
    this.service.getConfig(); // OK - инициализация сервиса
  }

  ngOnInit() {
    // this.value содержит актуальное значение
    this.service.loadData(this.value); // Правильное место для логики инициализации
  }
}

Резюмируем

  • Constructor - для базовой инициализации класса и внедрения зависимостей
  • ngOnInit - для Angular-специфичной инициализации после установки Input-свойств
  • 90% инициализационной логики должно быть в ngOnInit
  • Constructor должен оставаться максимально простым