typescript - Angular:為什麼沒有訪問修飾符的建構子參數在建構子之外不可見?
當我明確為建構子參數指定存取修飾符時,它在建構子外部也是可見的,例如:
constructor(private employeResourceService:EmployeeResourceService ){
//code}
ngOnInit(){
this.employeResourceService=undefined;//possible
}
但是當我移除存取修飾符時,建構函數的參數在建構函數外部是看不到的,例如:
constructor(employeResourceService:EmployeeResourceService ){
//code}
ngOnInit(){
this.employeResourceService=undefined;//not visible
}
為什麼會發生這種情況?TypeScript 沒有像 Java 那樣的預設存取修飾符嗎?
答案#1
給函數參數指定存取修飾符是毫無意義的。在 TypeScript 中,你無論如何可以對建構函數這樣做,其含義如下:當你寫
class MyClass {
constructor(private employeResourceService: EmployeeResourceService){
//code
}
}
這實際上是一個捷徑,用於
class MyClass {
private employeResourceService: EmployeeResourceService
constructor(employeResourceService: EmployeeResourceService){
this.employeResourceService = employeResourceService
//code
}
}
所以,在單一指令中,你已經定義了一個實例參數並且用參數值影響了它。這個捷徑只有在你提供存取說明詞時才有效。如果你沒有提供,它就會變成一個普通的函數參數,既沒有被宣告為實例參數,也沒有被影響到任何東西。
無論如何,存在一個預設的存取值,但要使用它,你必須宣告實例參數,並自行影響它:
class MyClass {
employeResourceService: EmployeeResourceService
constructor(employeResourceService: EmployeeResourceService){
this.employeResourceService = employeResourceService
//code
}
}
答案#2
那是刻意為之,目的是讓程式碼更簡潔:在建構函數的輸入參數中加入存取修飾符,是在類別中宣告欄位、將參數傳入建構函數、然後再將其指派給類別欄位的一種簡短寫法。
而這其實有文件記載:https://www.typescriptlang.org/docs/handbook/classes.html#parameter-properties
編輯:Typescript 確實有一個默認的輸入參數模式:即當你只需要在構造函數中使用輸入參數,而之後不再需要時。例如一個很好的例子是 FormBuilder,你通常不會將它存儲在欄位中,因為你只需要使用它一次。
