typescript Class类

45 阅读2分钟

ES6提供了更接近传统语言的写法,引入了Class(类)这个概念,作为对象的模板。通过class关键字,可以定义类。基本上,ES6的class可以看作只是一个语法糖,它的绝大部分功能,ES5都可以做到。

class Person {
  name: string;
  age: number;
  constructor(name: string, age: number) {
    this.name = name;
  }
  run() {}
}

类的修饰符

  • public:代表定义的变量内部与外部都可以访问,默认不写就是public
  • private:代表定义的变量是私有的,只能在内部访问
  • protected:代表定义的变量是受保护,只能在内部和继承的子类中访问
class Person {
  private name: string;
  protected age: number;
  constructor(name: string, age: number) {
    this.name = name;
    this.age = age;
  }
  run() {}
}
let lisi = new Person("李四", 24);
lisi.name; //属性“name”为私有属性,只能在类“Person”中访问
lisi.age; //属性“age”受保护,只能在类“Person”及其子类中访问
class Man extends Person {
  constructor() {
    super("李四", 24);
    this.age = 35;
  }
}
let man = new Man();

static

  • 静态属性:使用static定义的属性,不能通过this去访问,只能通过类名去调用。
  • 静态方法:使用static定义的方法,不能通过this去访问,只能通过类名去调用。如果两个方法都是static方法就可以互相调用
class Person {
  name: string;
  age: number;
  static sex: string = "男";
  constructor(name: string, age: number) {
    this.age = age;
    this.name = name;
  }
  static run() {
    this.build();
  }
  static build() {
    this.run();
  }
}
Person.sex;
Person.run();

interface:定义类使用关键字implements,后面跟多个interface 的名字(使用,隔开)

interface PersonClass {
  get(type: boolean): boolean;
}
interface PersonClass2 {
  set(): void;
  name: string;
}
class A {
  name: string;
  constructor() {
    this.name = "张三";
  }
}
class Person extends A implements PersonClass, PersonClass2 {
  name = "John";
  constructor() {
    super();
  }
  get(type: boolean) {
    return false;
  }
  set() {}
}

抽象类:应用场景:写的类实例化之后毫无用处,此时可以把它定义为抽象类,或者把它作为一个基类->通过继承一个派生类去实现基类的一些方法

abstract class A {
  name: string;
  constructor(name: string) {
    this.name = name;
  }
  print(): string {
    return this.name;
  }
}
class B extends A {
  constructor() {
    super("张三");
  }
  getName(): string {
    return this.name;
  }
}
let b = new B();
b.getName();