TypeScript 可以使用三種訪問修飾符(Access Modifiers),分別是 public、private 和 protected。
- public 修飾的屬性或方法是公有的,可以在任何地方被訪問到,默認所有的屬性和方法都是 public 的
- private 修飾的屬性或方法是私有的,不能在聲明它的類的外部訪問
- protected 修飾的屬性或方法是受保護的,它和 private 類似,區別是它在子類中也是允許被訪問的
下面舉一些例子:
class Animal { public name; public constructor(name) { this.name = name; } } let a = new Animal('Jack'); console.log(a.name); // Jack a.name = 'Tom'; console.log(a.name); // Tom
上面的例子中,name 被設置為了 public,所以直接訪問實例的 name 屬性是允許的。
很多時候,我們希望有的屬性是無法直接存取的,這時候就可以用 private 了:
class Animal { private name; public constructor(name) { this.name = name; } } let a = new Animal('Jack'); console.log(a.name); // Jack a.name = 'Tom'; // index.ts(9,13): error TS2341: Property 'name' is private and only accessible within class 'Animal'. // index.ts(10,1): error TS2341: Property 'name' is private and only accessible within class 'Animal'.
需要注意的是,TypeScript 編譯之后的代碼中,並沒有限制 private 屬性在外部的可訪問性。
上面的例子編譯后的代碼是:
var Animal = (function () { function Animal(name) { this.name = name; } return Animal; }()); var a = new Animal('Jack'); console.log(a.name); a.name = 'Tom';
使用 private 修飾的屬性或方法,在子類中也是不允許訪問的:
class Animal { private name; public constructor(name) { this.name = name; } } class Cat extends Animal { constructor(name) { super(name); console.log(this.name); } } // index.ts(11,17): error TS2341: Property 'name' is private and only accessible within class 'Animal'.
而如果是用 protected 修飾,則允許在子類中訪問:
class Animal { protected name; public constructor(name) { this.name = name; } } class Cat extends Animal { constructor(name) { super(name); console.log(this.name); } }