TypeScript 類訪問修飾符

admin發表於2018-08-11

關於類的基本用法,可以參閱TypeScript class 類介紹一章節。

下面分別介紹一下類的訪問修飾符:

一.public訪問修飾符:

在TypeScript中,成員都預設為public(在C#等語言則需要顯式的規定);可以省略。

程式碼例項如下:

[typescript] 純文字檢視 複製程式碼
class Antzone {
  public webName: string;
  public constructor(webName: string) { this.webName = webName; }
  public show(age: number) {
    console.log(`${this.webName} 成立 ${age}年了.`);
  }
}
let antzone=new Antzone("螞蟻部落");
antzone.show(4);

使用public修飾的成員,可以在類的內外自由訪問。

二.private修飾符:

當成員被標記成private時,就不能在宣告它的類的外部訪問。

程式碼例項如下:

[typescript] 純文字檢視 複製程式碼
class Antzone {
  private webName: string;
  public constructor(webName: string) { this.webName = webName; }
  public show(age: number) {
    console.log(`${this.webName} 成立 ${age}年了.`);
  }
}
let antzone=new Antzone("螞蟻部落");
antzone.webName;

由於webName是私有型別,所以會報錯,截圖如下:

a:3:{s:3:\"pic\";s:43:\"portal/201808/11/002826kjjc19xcfitv8u1e.jpg\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

三.protected訪問修飾符:

protected與private行為相似,但有一點不同,protected成員在派生類中可以訪問。

程式碼例項如下:

[typescript] 純文字檢視 複製程式碼
class Person {
  protected name: string;
  constructor(name: string) { this.name = name; }
}

class Employee extends Person {
  private department: string;

  constructor(name: string, department: string) {
    super(name)
    this.department = department;
  }

  public getElevatorPitch() {
    return `Hello, my name is ${this.name} and I work in ${this.department}.`;
  }
}

let howard = new Employee("Howard", "Sales");
console.log(howard.getElevatorPitch());
console.log(howard.name);

由於父類中的name訪問修飾符是protected,所以可以在它的派生類中訪問:

[typescript] 純文字檢視 複製程式碼
public getElevatorPitch() {
    return `Hello, my name is ${this.name} and I work in ${this.department}.`;
  }

所以上面的程式碼是正確的,但是不能夠在類的外部訪問:

[typescript] 純文字檢視 複製程式碼
console.log(howard.name)

所以上面的程式碼會報錯,截圖如下:

a:3:{s:3:\"pic\";s:43:\"portal/201808/11/002456kr7k7l4dni4rqhkz.jpg\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

四.readonly修飾符:

使用readonly關鍵字將屬性設定為只讀的。 

只讀屬性必須在宣告時或建構函式裡被初始化,程式碼例項如下:

[typescript] 純文字檢視 複製程式碼
class Antzone {
  readonly webName: string;
  public constructor(webName: string) { this.webName = webName; }
  public show(age: number) {
    console.log(`${this.webName} 成立 ${age}年了.`);
  }
}
let antzone=new Antzone("螞蟻部落");
antzone.webName="螞蟻奮鬥";

由於webName是隻讀的,所以在非宣告或者建構函式裡給它賦值會報錯。

相關文章