一:类的访问类型
1、public,在类内和类外均可调用。
class Person {
name: string;
// 相当于 public name: string
public sayHello(){
console.log(this.name + ' say Hello')
}
}
// 类外
const person = new Person();
person.name = "jspang.com";
2、private,只允许在类内部使用,不可在类外部使用。
class Person {
private name:string;
public sayHello(){
console.log(this.name + 'say Hello') //此处不报错
}
}
// 类外
const person = new Person()
person.name = 'jspang.com' //此处报错
person.sayHello()
console.log(person.name) //此处报错
3、protected,允许在类内或继承的子类使用。
class Person {
protected name:string;
public sayHello(){
console.log(this.name + 'say Hello') //此处不报错
}
}
class Teacher extends Person{
public sayBye(){
console.log(this.name); // 不报错
}
}
二:类的构造函数
class Person{
public name :string ;
constructor(name:string){
this.name=name
}
// 相当于
constructor(public name:string) { }
}
const person= new Person('jspang')
console.log(person.name)
在子类中使用构造函数需要用super()
调用父类的构造函数:
class Person{
constructor(public name:string){}
}
class Teacher extends Person{
constructor(public age:number){
super('jspang')
}
}
const teacher = new Teacher(18)
console.log(teacher.age)
console.log(teacher.name)
// 如果父类没有构造函数,也需要调用super。
class Person{}
class Teacher extends Person{
constructor(public age:number){
super()
}
}
const teacher = new Teacher(18)
console.log(teacher.age)
三:类的getter、setter、static和readonly
1、getter,可以用于暴露类内的private属性和加一层处理。
2、setter,在设置属性时,处理传进来的参数。
class Xiaojiejie {
constructor(private _age:number){}
get age(){
return this._age-10
}
set age(age:number){
this._age = age+3
}
}
const dajiao = new Xiaojiejie(28)
dajiao.age=25
console.log(dajiao.age)
3、static,不需要实例化类就可以取得类的属性和方法。
class Girl {
static sayLove() {
return "I Love you";
}
}
console.log(Girl.sayLove());
4、readonly,只读属性。
class Person {
public readonly _name :string;
constructor(name:string ){
this._name = name;
}
}
const person = new Person('jspang')
person._name= '谢广坤' // 报错
console.log(person._name)
四:抽象类,要求继承的子类必须声明某些属性或方法。
比如我开了一个红浪漫洗浴中心,里边有服务员,有初级技师,高级技师,每一个岗位我都写成一个类。我作为老板,我要求无论是什么职位,都要有独特的技能,比如服务员就是给顾客倒水,初级技师要求会泰式按摩,高级技师要求会 SPA 全身按摩。这是一个硬性要求,但是每个职位的技能有不同,这时候就可以用抽象类来解决问题。
abstract class Girl{
abstract skill() //因为没有具体的方法,所以我们这里不写括号
}
class Waiter extends Girl{
skill(){
console.log('大爷,请喝水!')
}
}
class BaseTeacher extends Girl{
skill(){
console.log('大爷,来个泰式按摩吧!')
}
}
class seniorTeacher extends Girl{
skill(){
console.log('大爷,来个SPA全身按摩吧!')
}
}