Herança e membros do modificador

A classe básica implementação

Definir uma classe Dog, e ES é diferente é que nós adicionamos ao tipo anotações atributo membro, mas também aumenta os tipos de anotações como um parâmetro para o construtor.

class Dog {
  constructor(name: string) {
    this.name = name
  }
  name: string
  run() {}
}

需要注意的是:
    (1)无论是在ES还是ts中,类成员的属性都是实例属性,而不是原型属性;类成员的方法也都是实例方法。对比可见:
  console.log(Dog.prototype) // {run: ƒ, constructor: ƒ}
  let dog = new Dog('wangwang')
  console.log(dog) // Dog {name: "wangwang"}
  (2)与ES不同的是,实例的属性必须具有初始值,或者在构造函数中被初始化。 以下√的三种方式均是可以的:

  class Dog {
    constructor(name: string) {
      // this.name = name   √
    }
    // name: string = 'dog'   √
    // name?: string = 'dog'   √
    run() {}
  }

A herança de classe (uso de palavras-chave estende-se)

class Husky extends Dog {
  constructor(name: string, color: string) {
    super(name)
    this.color = color
  }
  color: string
}

Note-se que:
(1) o construtor da classe derivada deve conter uma chamada 'super', os parâmetros e parâmetro deve conter a classe pai.
(2) propriedade recentemente adicionado ao ser inicializado no construtor em geral, e isso costumava ser chamado após a chamada super.

Os membros da classe de modificadores (que é uma extensão dos ts ES)

membro do público: todos são visíveis, público + formato de nome de atributo / função de
membros privados, também pode ser chamado em uma classe por si só, não pode ser invocado instância da classe não pode ser chamado por subclasses, privado + atributo formato nome / função

class Dog {
  constructor(name: string) {
    this.name = name
  }
  name: string
  run() {}
  private pri() {}
}
let dog = new Dog('wangwang')
dog.pri()   ❌
class Husky extends Dog {
  constructor(name: string) {
    super(name)
    this.pri()   ❌
  }
}

PS:
    也可以给构造函数加上私有成员属性,作用是类既不能被实例化,也不能被继承,都会提示错误。

  class Dog {
    private constructor(name: string) {
      this.name = name
    }
    name: string
  }
  let dog = new Dog('wangwang')   ❌
  class Husky extends Dog { }   ❌

Membros protegidos podem ser acessados ​​somente em classe ou sub-classe, mas a instância de classe não pode ser acessado, protegidos + formato de nome de atributo / função.

class Dog {
  constructor(name: string) {
    this.name = name
  }
  name: string
  protected pro() {}
}
let dog = new Dog('wangwang')
dog.pro()   ❌
class Husky extends Dog {
  constructor(name: string) {
    super(name)
    this.pro()     ✔
  }
}

PS: 
  构造函数也能被声明为protected,作用是这个类不能被实例化,只能被继承,就相当于声明了一个基类。
  class Dog {
    protected constructor(name: string) {
      this.name = name
    }
    name: string
  }
  let dog = new Dog('wangwang') // ❌
  class Husky extends Dog {
    ......
  }

Read-only atributo: não pode ser alterada lembro como atributo de instância deve ser inicializado.

class Dog {
  constructor(name: string) {
    this.name = name
  }
  name: string
  readonly legs: number = 4
}

Construtor parâmetro modificador pode ser adicionado, o seu papel é o parâmetro automaticamente em uma propriedade da instância, e pode ser omitido na definição da classe.

class Husky extends Dog {
  constructor(name: string, public color: string) {
    super(name)
    this.color = color
  }
  // color: string
}

Membro estático: classe só pode ser chamado pelo nome, em vez de através de uma subclasse chamada, pode ser herdada, forma estática modificador + nome da propriedade.

class Dog {
  constructor(name: string) {
    this.name = name
  }
  name: string
  static food: string = 'bones'
}
let dog = new Dog('wangwang')
console.log(Dog.food) // ✔
// console.log(dog.food) ❌    
class Husky extends Dog {
  constructor(name: string, public color: string) {
    super(name)
    this.color = color
  }
}
console.log(Husky.food)  // ✔

Acho que você gosta

Origin www.cnblogs.com/xfxing/p/12652423.html
Recomendado
Clasificación