修飾符 public、 private 和 protected和區別

 

TypeScript 能夠使用三種訪問修飾符(Access Modifiers),分別是 public、private 和 protected。this

  • public 修飾的屬性或方法是公有的,能夠在任何地方被訪問到,默認全部的屬性和方法都是 public 的
  • private 修飾的屬性或方法是私有的,不能在聲明它的類的外部訪問
  • protected 修飾的屬性或方法是受保護的,它和 private 相似,區別是它在子類中也是容許被訪問的

下面舉一些例子:spa

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 屬性是容許的。code

不少時候,咱們但願有的屬性是沒法直接存取的,這時候就能夠用 private 了:blog

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 屬性在外部的可訪問性。ip

上面的例子編譯後的代碼是:it

var Animal = (function () {
    function Animal(name) {
        this.name = name;
    }
    return Animal;
}());
var a = new Animal('Jack');
console.log(a.name);
a.name = 'Tom';

 

使用 private 修飾的屬性或方法,在子類中也是不容許訪問的:io

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 修飾,則容許在子類中訪問:console

class Animal {
  protected name;
  public constructor(name) {
    this.name = name;
  }
}
 
class Cat extends Animal {
  constructor(name) {
    super(name);
    console.log(this.name);
  }
}
相關文章
相關標籤/搜索