修饰符 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);
  }
}
相关文章
相关标签/搜索