參考這個StackOverflow讨論Difference between Constructor and ngOnInit
得贊超過1000的答案:
The Constructor is a default method of the class that is executed when the class is instantiated and ensures proper initialisation of fields in the class and its subclasses. Angular, or better Dependency Injector (DI), analyses the constructor parameters and when it creates a new instance by calling new MyClass() it tries to find providers that match the types of the constructor parameters, resolves them and passes them to the constructor like
當class被執行個體化時,constructor是預設被執行的方法,確定類和其子類都被正确地初始化。Angular依賴注入機制,會分析constructor的輸入參數,當使用new MyClass建立class執行個體時,會試着去查找能比對構造函數類型的providers,解析providers并将結果傳遞到類的構造函數裡。
ngOnInit is a life cycle hook called by Angular to indicate that Angular is done creating the component.
ngOnInit是一個生命周期鈎子,Angular調用ngOnInit時,向應用程式傳遞這樣一個資訊:Angular已經完成了Component的建立工作。
We have to import OnInit like this in order to use it (actually implementing OnInit is not mandatory but considered good practice):

Implement this interface to execute custom initialization logic after your directive’s data-bound properties have been initialized. ngOnInit is called right after the directive’s data-bound properties have been checked for the first time, and before any of its children have been checked. It is invoked only once when the directive is instantiated.
Mostly we use ngOnInit for all the initialization/declaration and avoid stuff to work in the constructor. The constructor should only be used to initialize class members but shouldn’t do actual “work”.
So you should use constructor() to setup Dependency Injection and not much else. ngOnInit() is better place to “start” - it’s where/when components’ bindings are resolved.
最佳實踐
constructor隻用于setup依賴注入,以及初始化類的成員。其他所有業務相關的自定義初始化邏輯,均放在ngOnInit hook裡完成。