08.TS中的Class类

81 阅读2分钟

Es6提供了更接近传统语言类的写法,引入了Class类这个概念。Es6的Class可以看作是一个语法糖,他的功能Es5大多都可以做到。写法更加清晰更像面向对象编程的语法。

在Ts中定义类
// 在Ts中定义类
class Person {
  name: string
  age: number
  gender: string
  constructor(name: string, age: number, gender: string) {
    this.name = name
    this.age = age
    this.gender = gender
  }
}
​
const person = new Person('Yang', 18, '男')
​
类的修饰符

1.Public 公共的 内部外部都可以访问 不写默认就是public

// 在Ts中定义类
class Person {
  // public公共的 内部外部都可以访问 不写默认就是public
  public name: string
  age: number
  gender: string
  constructor(name: string, age: number, gender: string) {
    this.name = name
    this.age = age
    this.gender = gender
  }
}
​
const person = new Person('Yang', 18, '男')
console.log(person.name) // 可以正常访问

2.Private 私有的 只有内部的方法可以访问 外部无法访问

// 在Ts中定义类
class Person {
  public name: string
  // private 私有的 只有内部的方法可以访问 外部无法访问
  private age: number
  gender: string
  constructor(name: string, age: number, gender: string) {
    this.name = name
    this.age = age
    this.gender = gender
  }
​
  changeAge() {
    this.age++
    console.log(this.age)
  }
}
​
const person = new Person('Yang', 18, '男')
// console.log(person.age) // 属性age是私有的 只能在Person类中访问
person.changeAge() // 19

3.protected 受保护的只有内部和子类中可以访问

// 在Ts中定义类
class Person {
  public name: string
  private age: number
  // protected 受保护的 只能在内部和子类中访问
  protected gender: string
  constructor(name: string, age: number, gender: string) {
    this.name = name
    this.age = age
    this.gender = gender
  }
}
​
const p1 = new Person('Yang', 18, '男')
// console.log(person.gender) // 属性“gender”受保护,只能在类“Person”及其子类中访问。
class Man extends Person {
  constructor(name: string, age: number, gender: string) {
    super('Yang', 18, '男')
  }
  // 子类中访问并改变
  changeGender() {
    this.gender = '女'
    console.log(this.gender)
  }
}
​
const p2 = new Man('Yang', 18, '男')
p2.changeGender()
​

4.static

// 在Ts中定义类
class Person {
  public name: string
  public age: number
  protected gender: string
  // 类的静态属性 相当于构造函数给函数对象赋值一个属性
  static game: string = '重装机兵'
  constructor(name: string, age: number, gender: string) {
    this.name = name
    this.age = age
    this.gender = gender
  }
  // 静态方法只能访问静态属性 因为this是Person
  static play() {
    console.log(this == Person) // true
    console.log(this.game) // 可以
  }
}
// 访问类的静态属性
console.log(Person.game)
Person.play()
​
通过interface约束类
interface Person {
  play(str: string): string
}
​
// 类P实现Person接口 此时P必须实现play方法
class P implements Person {
  play(str: string): string {
    return str
  }
}
​
const person = new P()
​
interface Person {
  play(str: string): string
  set(): void
}
interface P2 {
  hhh(): void
}
// A实现了set方法
class A {
  set() {}
  hhh() {}
}
​
// 类P实现Person接口 此时P必须实现play方法
// 通过继承来的方法也可以实现接口
// 可以实现多个接口
class P extends A implements Person, P2 {
  play(str: string): string {
    return str
  }
}
​
const person = new P()
​