Skip to main content

[TS] Classes

  • Field and Methods:在 Class 中,帶一般值的「屬性」稱作 field;帶一般值的「函式」稱作 method。

Inheritance#

  • 預設的情況下,若子類別沒有使用 constructor 這個關鍵字它會自動繼承父層的 constructor
class Square {
constructor(public width: number) {}
}
// 子類別沒有使用 constructor 關鍵字的時候,會自動繼承父層的 constructor
class Rectangle extends Square {}
const square = new Square(10);
const rectangle = new Rectangle(20);
console.log(square); // { width: 10 }
console.log(rectangle); // { width: 20 }

若子類別有使用 constructor ,則需要使用 super 來表示複層的 constructor:

class Square {
constructor(public width: number) {}
}
// 子類別「有」使用 constructor 關鍵字的時候,需要透過 super 來啟動父層的 constructor
class Rectangle extends Square {
constructor(width: number, public height: number) {
super(width);
}
}
const square = new Square(10);
const rectangle = new Rectangle(10, 20);
console.log(square); // { width: 10 }
console.log(rectangle); // { width: 10, height: 20 }

Method Modifier#

  • Public(default): 在類別中或透過實例(instance)都可以呼叫此方法,沒有特別宣告的話,預設就是 public
  • Private:只能在該 class 內使用此方法,實例不能
  • Protected:該 class 及繼承該 class 的其他類別內都可以呼叫此方法,但實例不能

在 Methods 中使用#

class Vehicle {
// Methods
public honk(): void {
console.log('beep');
}
private drive(): void {
console.log('vroom');
}
// protected 的方法可以透過繼承給其他 class 呼叫
protected woo(): void {
console.log('woo');
}
}
const vehicle = new Vehicle();
vehicle.honk(); // public method 可以透過實例呼叫
vehicle.drive(); // 錯誤,private method 不可透過實例呼叫
vehicle.woo(); // 錯誤,protected method 不可透過實例呼叫

在 Constructors 中使用#

public#

// 寫法一:需要使用 this.height = height
class Square {
width: number = 20;
height: number;
constructor(height: number) {
this.height = height;
}
}
// 寫法二:使用 public height 後可以省略許多
class Square {
width: number = 20;
constructor(public height: number) {}
}
const square = new Square(40); // { width: 20, height: 40 }

private#

在實例中將無法存取 private 的屬性:

// 對 width 和 height 都添加 private modifier
class Square {
private width: number = 20;
constructor(private height: number) {}
}
const square = new Square(40);
console.log(square); // 可以存取,{ width: 20, height: 40 }
console.log(square.width); // 錯誤發生!private 屬性不能直接透過 instance 存取
Last updated on