TypeScript(十)类的用法(修饰符)

169 阅读2分钟

本节我们学习TypeScript中类的访问修饰符,分别是public、private 和 protected。我们先说定义然后分别去举例解释。

public 公有的,可以在任何地方被访问到,默认所有的属性和方法都是publicprivate 私有的,不能在声明它的类的外部访问
protected 受保护的,和 private 类似,区别是它在子类中可以被访问

在学习之前我们先要弄清楚类的外部和内部

class Person {
  name: string;
  constructor() {
    this.name = "詹姆斯"
  }
  say() {
    return "我的名字是" + this.name
  }
}
const persons = new Person();
console.log(persons.name)     
console.log(persons.say()) 

上面的代码我们定义了一个名叫Person 的类,它用{}包起来,{}之内的叫做类的内部,{}之外的叫做类的外部。

一、public

class Person {
  name: string;
  constructor() {
    this.name = "詹姆斯"
  }
  say() {
    return "我的名字是" + this.name
  }
}

const persons = new Person();
console.log(persons.name)     //詹姆斯
console.log(persons.say())    //我的名字是詹姆斯

我们执行上面的代码可以看到,persons可以访问到类的属性和方法,是因为默认所有的属性和方法都是 public的,可以看成属性和方法的前面都默认加了一个public关键字,所以在类的内部和外部都可以访问到。

二、private

class Person {
  private name: string;
  constructor() {
    this.name = "詹姆斯"
  }
  say() {
    return "我的名字是" + this.name
  }
}

const persons = new Person();
console.log(persons.name)     //报错
console.log(persons.say())    //我的名字是詹姆斯

当我们在上段代码name的前面加上private时,可以看到编辑器会报错,因为此时name已经被定义为只能在内部访问,say方法可以被打印出来,是因为没有被定义private,默认值是public,所以能被外部访问到。

三、protected

protected的用法private 类似,区别在于子类可以被访问到

1.private

class Parent {
  private name: string;
  constructor() {
    this.name = '詹姆斯'
  }
}

class Child extends Parent {
  say() {
    return "我的名字是" + this.name    //编辑器报错
  }
}

let child = new Child();  
console.log(child.say())              //子类访问不到,不能打印

2.protected

class Parent {
  protected name: string;
  constructor() {
    this.name = '詹姆斯'
  }
}

class Child extends Parent {
  say() {
    return "我的名字是" + this.name;
  }
}

let child = new Child();  
console.log(child.say())              //我的名字是詹姆斯

对比两段代码,可以看到private修饰符,子类中访问不到;protected修饰符,子类中可以访问到,这也是两者最本质的区别。