三、类

作者: zdxhxh | 来源:发表于2020-02-19 10:00 被阅读0次

传统的javascript程序员会基于函数和基于原型的继承创建可重用的组件,但对于熟悉面向对象的程序员使用这些语法可能会比较麻烦。

从ES6开始,Javascript程序员能够使用基于类的面向对象方式。使用Typescript也支持对类的相关功能支持。并且编译后支持全平台

示例

class A { 
  name : string
  constructor(name : string){
    this.name = name 
  }
  say() { 
    return 'hellor' + this.name 
  }
}
let a = new A('halan')

1. 继承

基于类的程序设计中一种最基本的模式是允许使用继承来扩展现有的类。

class Parent { 
  name : string
  constructor(name : string){
    this.name = name 
  }
  say() { 
    return 'hellor' + this.name 
  }
}

class Child extends Parent{ 
  constructor(name : string ) { 
    // 在构造函数执行this属性之前 一定要调用super
    super(name)
  }
  go() { 
    console.log('go')
  }
}

2. 公有、私有与受保护的修饰符

在 TypeScript 里,成员都默认为 public

private 修饰符不能在类的外部访问,只能在类的实例方法中访问

class A { 
  private name : string 
  constructor(name : string){
    this.name = name 
  }
  say() { 
    console.log(this.name)
  }
}
new A('海伦堡').name // 错误 name是私有的

protected 与private 修饰的行为类似,但能在派生类中访问

class Person {
  protected name: string
  constructor(name: string) { 
    this.name = name 
  }
}
class Employee extends Person {
  private department: string

  constructor(name: string, department: string) {
    super(name)
    this.department = department
  }
  
  getElevatorPitch() {
    return `Hello, my name is ${this.name} and I work in ${this.department}.`
  }
}

let howard = new Employee('Howard', 'Sales')
console.log(howard.getElevatorPitch())
console.log(howard.name)

3. readonly

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

class Person {
  readonly name: string
  constructor(name: string) {
    this.name = name
  }
}

4. 参数属性

很多时候我们需要在构造函数写this.name = name

而使用参数属性可以省略这个过程,这种可以将声明与赋值结合在一起,十分方便

class Person {
  constructor(readonly name: string,private age : number) {
  }
}

5. 存储器

TypeScript 支持通过 getters/setters 来截取对象成员的访问,能有效帮助你控制对象成员访问。

class Employee {
  private _fullName: string

  get fullName(): string {
    return this._fullName
  }

  set fullName(newName: string) {
    if (passcode && passcode == 'secret passcode') {
      this._fullName = newName
    }
    else {
      console.log('Error: Unauthorized update of employee!')
    }
  }
}

对于存取器有下面几点需要注意的:

首先,存取器要求你将编译器设置为输出 ECMAScript 5 或更高。 不支持降级到 ECMAScript 3。其次,只带有 get 不带有 set 的存取器自动被推断为 readonly。这在从代码生成 .d.ts 文件时是有帮助的,因为利用这个属性的用户会看到不允许够改变它的值

6. 静态属性

Java等强类型语言,常常会使用工具类定义一系列的方法或属性,这些方法或属性存在类上面而不是类的实例上,TypeScript可以在类中使用static定义静态属性,无论在类中还是类外都需要使用类.属性名访问

class A { 
  static draly = {x : 0,y : 0} 
}
console.log(A.draly)

7. 抽象类

抽象类描述派生类的包含成员的实现细节,抽象类可以作为其他派生类的基类使用,他们一般不会直接实例化,可以使用abstract关键字定义抽象类和抽象类内部定义的抽象方法。

abstract class Department {
  name: string

  constructor(name: string) {
     this.name = name
  }

  printName(): void {
    console.log('Department name: ' + this.name)
  }

  abstract printMeeting(): void // 必须在派生类中实现
}

class AccountingDepartment extends Department {
  constructor() {
    super('Accounting and Auditing') // 在派生类的构造函数中必须调用 super()
  }

  printMeeting(): void {
    console.log('The Accounting Department meets each Monday at 10am.')
  }

  generateReports(): void {
    console.log('Generating accounting reports...')
  }
}

let department: Department // 允许创建一个对抽象类型的引用
department = new Department() // 错误: 不能创建一个抽象类的实例
department = new AccountingDepartment() // 允许对一个抽象子类进行实例化和赋值
department.printName()
department.printMeeting()
department.generateReports() // 错误: 方法在声明的抽象类中不存在

相关文章

  • 三、类

    类 传统的javascript程序员会基于函数和基于原型的继承创建可重用的组件,但对于熟悉面向对象的程序员使用这些...

  • 高级类(三)

    何时以及为什么要子类化。 本章介绍了类的继承,以及子类化相关的众多编程技术。 但是你可能会问,“什么时候我应该子类...

  • python类(三)

    之前我们已经写过将函数封装成模块的代码,类也可以封装成一个模块。 现在新建一个restaurant.py的文件,内...

  • TypeScript(三)类

    TypeScript中的类不仅具有ES6中类的全部功能,还提供了修饰符、抽象类等其他新功能。 用法 类使用clas...

  • 集合类(三)

    Java 8中Map相关的红黑树的引用背景、原理 HashMap的容量、扩容 很多人在通过阅读源码的方式学习Jav...

  • 入门(三)类

    1、定义类 (1)、实例函数 (2)、类属性和类方法 使用@classmethod修饰的方法是类方法实例可以调用类...

  • 西拉法叶的雪:你所知道的顶层设计到底是什么?(44)

    纵观历史,人类所有的知识与智慧,都可以概括为三类“关系”,分别对应三类现象,形成三类知识,总结为三类法则。 **心...

  • 学生各科平均成绩报表

    题干: 编写三个类,一个 map类,一个reduce类,一个mian方法类。 一、map类 二、reduce 三、...

  • 日语动词变形笔记整理

    日语动词里有三种类型的动词,概括为一类、二类、三类动词,其中二类动词三类动词最好区分,其余动词均为一类动词,各种动...

  • 书评 | 摄影有关书籍短评

    一、基础类 二、人像类 三、风光类 四、静物美食类 五、建筑类 六、其他

网友评论

      本文标题:三、类

      本文链接:https://www.haomeiwen.com/subject/mmiofhtx.html