本节我们学习TypeScript中类的访问修饰符,分别是public、private 和 protected。我们先说定义然后分别去举例解释。
public 公有的,可以在任何地方被访问到,默认所有的属性和方法都是public的
private 私有的,不能在声明它的类的外部访问
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修饰符,子类中可以访问到,这也是两者最本质的区别。