Typescript的类

类的定义

  1. class Person {
  2. name:string; // 定义属性,不写修饰符默认为public
  3. // 构造方法
  4. constructor(name:string) {
  5. this.name = name;
  6. }
  7. // 定义类中的方法
  8. getName():string{
  9. return this.name;
  10. }
  11. setName(name:string):void {
  12. this.name = name;
  13. }
  14. }
  15. // 类对象的实例化
  16. var p = new Person('张三');
  17. p.getName();

类中的readonly只能在声明或构造函数中被初始化

  1. class Octopus {
  2. readonly name: string;
  3. readonly numberOfLegs: number = 8;
  4. constructor (theName: string) {
  5. this.name = theName;
  6. }
  7. }
  8. let dad = new Octopus("Man with the 8 strong legs");
  9. dad.name = "Man with the 3-piece suit"; // 错误! name 是只读的.

类的继承

  1. // 使用extends关键字继承
  2. class Student extends Person {
  3. constructor(name:string) {
  4. super(name); // 使用super调用父类的构造方法
  5. }
  6. work():string {
  7. return `${this.name} 在工作`;
  8. }
  9. // 重写父类方法
  10. getName():string{
  11. return this.name + '...';
  12. }
  13. }

修饰符

属性修饰符(不加修饰符时,默认为public)

  • public : 共有,在类的里面、子类、类外面都可以访问
  • protected : 保护,在类的里面、子类可以访问,在类外部不能访问
  • private : 私有,在类里面可以访问。在子类和类外部都不能访问

静态属性/静态方法

  1. class Person {
  2. public name:string;
  3. static sex:string = '男'; // 静态属性
  4. constructor(name:string) {
  5. this.name=name;
  6. }
  7. // 静态方法
  8. static print():void {
  9. alert(`${this.sex}`); // 静态方法中只能调用静态属性
  10. }
  11. }
  12. // 静态属性和静态方法不需要实例化对象,可直接通过类名调用
  13. Person.print();
  14. alert(Person.sex);

多态

父类定义一个方法不去实现,让继承它的子类去实现,每一个子类有不同的表现。

多态属于继承。

  1. class Animal {
  2. name:string;
  3. constructor (name:string) {
  4. this.name = name;
  5. }
  6. eat() {
  7. console.log('吃function');
  8. }
  9. }
  10. class Dog extends Animal {
  11. constructor(name:string) {
  12. super(name);
  13. }
  14. eat() {
  15. alert('狗吃肉');
  16. }
  17. }
  18. class Cat extends Animal {
  19. constructor(name:string) {
  20. super(name);
  21. }
  22. eat() {
  23. alert('猫吃老鼠');
  24. }
  25. }

抽象类

typescript 中的抽象类: 是提供其他类继承的基类,不能直接被实例化

用abstract 关键字定义抽象类和抽象方法,抽象类中的抽象方法不包含具体实现并且必须在派生类中实现

abstract抽象方法只能放在抽象类中

  1. // 抽象类使用ab
  2. abstract class Animal {
  3. name:string;
  4. constructor (name:string) {
  5. this.name = name;
  6. }
  7. abstract eat():void;
  8. }

存取器

类似Java的setter/getter方法。

只有get没有set的存取器会自动被推断为readonly

  1. let passcode = "secret passcode";
  2. class Employee {
  3. private _fullName: string;
  4. // 等同于创建了一个fullName变量,get获取其值,set为其赋值
  5. get fullName(): string {
  6. return this._fullName;
  7. }
  8. set fullName(newName: string) {
  9. if (passcode && passcode == "secret passcode") {
  10. this._fullName = newName;
  11. }
  12. else {
  13. console.log("Error: Unauthorized update of employee!");
  14. }
  15. }
  16. }
  17. let employee = new Employee();
  18. employee.fullName = "Bob Smith";
  19. if (employee.fullName) {
  20. alert(employee.fullName);
  21. }