类跟接口非常相似
接口是低配版的类。
类是高配版的接口。
类就是用来创造对象的东西。

2.png
class Human {
  name: string;
  age: number;
  constructor (name: string, age: number) {
    this.name = name
    this.age = age
  }
  say(): string {
    return 'hi'
  }
}

let simon:Human = new Human('simon', 18);

继承

class Animal {
  birth: string;
  constructor(public kind: string) {
    if(kind === '哺乳动物'){
      this.birth = '胎生'
    } else {
      this.birth = '卵生'
    }
  }
  move():void {}
}

class Human extends Animal{
  name: string;
  age: number;
  constructor (name: string, age: number) {
    super('哺乳动物') // 对应父类的constructor 基类
    this.name = name
    this.age = age
  }
  say(): string {
    this.move()
    return 'hi'
  }
}

let simon:Human = new Human('simon', 18);

公共,私有与受保护的修饰符

public 可以自由的访问程序里定义的成员; 默认就是public
private 当成员被标记成 private时,它就不能在声明它的类的外部访问。只能在自己的声明类内被使用
protected修饰符与 private修饰符的行为很相似,但有一点不同, protected成员在派生类中仍然可以访问。

class Animal {
  protected birth: string; // 只能在基类和派生类中使用。
  private Animalsecret: string;
  constructor(public kind: string) {
    this.Animalsecret = '1223'
    if(kind === '哺乳动物'){
      this.birth = '胎生'
    } else {
      this.birth = '卵生'
    }
  }
  move():void {}
}

class Human extends Animal{
  public name: string;
  age: number;
  private secret:string; // 只能在human类的作用域范围内使用
  constructor (name: string, age: number) {
    super('哺乳动物')
    this.name = name
    this.age = age
    this.secret = '我的秘密'
  }
  say(): string {
    this.move()
    return `hi ${this.birth} ${this.Animalsecret}` // birth在此处可以调用, Animalsecret不能在这里调用,会报错
  }
}

let simon:Human = new Human('simon', 18);
console.log(simon.secret) // 此处会报错

存取器

class Human{
  name: string;
  private _age: number; // 先设置为私有属性
  get age() {
    return this._age
  }
  set age(value) {
    if (value <= 0) {
      this._age = 0
    } else {
      this._age = value
    }
  }
  constructor (name: string, age: number) {
    this.name = name
    this._age = age
  }
  say(): string {
    return `hi`
  }
}

let simon:Human = new Human('simon', 19)
simon.age = -1 // 调用set存。有些值我希望改的时候增加一些限制,不能随便乱改
console.log(simon.age) // 调用了get 返回 0

静态属性

类的属性,不是实例的属性

class Human{
  static xxx =1;
  name: string;
  age: number;
  constructor (name: string, age: number) {
    this.name = name
    this.age = age
  }
  say(): string {
    return `hi`
  }
}

let simon:Human = new Human('simon', 19)
console.log(Human.xxx) // 1

抽象类

也可以叫做「爸爸类」:专门当别的类的爸爸的类。
也可以叫做「没有写完的类」:只描述有什么方法,并没有完全实现这些方法。
由于这个类没有写完,所以不能创建出对象。(会报错)

abstract class Animal { // 抽象类   跟接口有些类似
  abstract makeSound(): void; // 抽象方法,还没写完的方法。需要子类继续完善的方法
  move(): void {
      console.log('roaming the earch...');
  }
}
let simon = new Animal() // 无法创建抽象类。抽象类还没有写完 会报错

class Human extends Animal {
  constructor(public name:string, public age: number){
    super()
  }
  makeSound(): void{ // 此处必须定义 makeSound。不然报错
    console.log('hi')
  }
}

readonly修饰符

你可以使用 readonly关键字将属性设置为只读的。 只读属性必须在声明时或构造函数里被初始化

class Human{
    readonly name: string;
    constructor (theName: string) {
        this.name = theName;
    }
}
let dad = new Human("simon");
dad.name = "jack"; // 错误! name 是只读的.

你可能感兴趣的:(类)