一:类的访问类型
1、public,在类内和类外均可调用。
class Person {name: string;// 相当于 public name: stringpublic 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=25console.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全身按摩吧!')}}
