在昨天我們介紹了建構子(Constructor)與存取修飾符(Access Modifiers)之後,今天要來介紹的是,TypeScript 如何用更優雅的方式來給予建構子裡面的私有或公有成員(private/public member)預設值。
我們昨天的例子是:
class Rectangle {
private width: number;
private length: number;
constructor(width: number, length: number) {
this.width = width;
this.length = length;
}
//...以下省略
}
// 建立物件同時給予 width 及 length 初始化
let rect = new Rectangle(10, 12);
其中在建構子的部分,相信有人一定會覺得下面這一段寫得很囉唆。
private width: number;
private length: number;
constructor(width: number, length: number) {
this.width = width;
this.length = length;
}
this.width = width
這個部份說的是把外面傳進來的參數(width)賦值給 class 內部宣告的私有成員 width。同理, length 也是一樣的意思。因為這樣寫真的有一些囉唆,所以 TypeScript 就增加了一個很優雅的宣告及初始化方式,我們只要將建構子改成下面這樣,他的效果就會等同於上面那樣。
constructor(private width: number, private length: number){}
在上面那個例子中,我們只要在建構子的參數位置 前方 加上 private
或 public
,TypeScript 就會自動幫我們宣告成為私有或公開的成員並且賦值給他。也就是說我們在建構子中寫 private name:string
就等於於之前的寫法:先宣告一個 private name;
接著在建構子中加入一個參數 name:string
,最後在建構子的實作中將 this.name = name;
賦值。
而這個建構子參數前的存取修飾符可以是 public 也可以是 private。
所以如果我們這樣寫(在參數後面加上 ?),這樣的寫法就等同於建構子的參數可有可無,然後他還會宣告兩個 private member,分別是 width 和 length。
class Rectangel {
constructor(private width?: number, private length?: number)
showWidthAndLength():void {
console.log('width is ' + width, 'length is ' + length);
}
}
// 以下兩種都是合法的
let rect1 = new Rectangle(2, 5);
let rect2 = new Rectangle();
TypeScript 提供了更優雅的方式讓我們可以透過建構子來宣告私有/公有成員,並且給予初始化的機會,不用在寫很多囉唆的程式碼。