说说你对 TypeScript 中类的理解?

604 阅读2分钟

一、是什么

image.png 类(Class)是面向对象程序设计(OOP,Object-Oriented Programming)实现信息封装的基础

类是一种用户定义的引用数据类型,也称类类型

传统的面向对象语言基本都是基于类的,JavaScript 基于原型的方式让开发者多了很多理解成本

在 ES6 之后,JavaScript 拥有了 class 关键字,虽然本质依然是构造函数,但是使用起来已经方便了许多

但是JavaScript 的class依然有一些特性还没有加入,比如修饰符和抽象类

TypeScript 的 class 支持面向对象的所有特性,比如 类、接口等

二、使用方式

定义类的关键字为 class,后面紧跟类名,类可以包含以下几个模块(类的数据成员):

  • 字段 : 字段是类里面声明的变量。字段表示对象的有关数据。
  • 构造函数: 类实例化时调用,可以为类的对象分配内存。
  • 方法: 方法为对象要执行的操作
    如下例子:
class Car {
  // 字段
  engine: string

  // 构造函数
  constructor(engine: string) {
    this.engine = engine
  }

  // 方法
  disp(): void {
    console.log('发动机为 :   ' + this.engine)
  }
}

继承

类的继承使用过extends的关键字

//父类
class Animal {  
  move(distanceInMeters: number = 0) {
    console.log(`Animal moved ${distanceInMeters}m.`)
  }
}
//子类
class Dog extends Animal {
  bark() {
    console.log('Woof! Woof!')
  }
}

const dog = new Dog()
dog.bark()
dog.move(10)

Dog是一个 派生类,它派生自 Animal 基类,派生类通常被称作子类,基类通常被称作 超类

Dog类继承了Animal类,因此实例dog也能够使用Animalmove方法

同样,类继承后,子类可以对父类的方法重新定义,这个过程称之为方法的重写,通过super关键字是对父类的直接引用,该关键字可以引用父类的属性和方法,如下:

class PrinterClass {
  doPrint(): void {
    console.log('父类的 doPrint() 方法。')
  }
}

class StringPrinter extends PrinterClass {
  doPrint(): void {
    super.doPrint() // 调用父类的函数
    console.log('子类的 doPrint()方法。')
  }
}

修饰符

可以看到,上述的形式跟ES6十分的相似,typescript在此基础上添加了三种修饰符:

ts类中成员(成员属性、成员方法)的访问修饰符,类似于java中类成员的访问修饰符,不同的是ts中默认是public修饰符。
public :公有          在当前类里面、 子类  、类外面都可以访问
protected:保护类型    在当前类里面、子类里面可以访问 ,在类外部没法访问
private :私有         在当前类里面可以访问,子类、类外部都没法访问
 
属性如果不加修饰符 默认就是公有(public)

私有修饰符

只能够在该类的内部进行访问,实例对象并不能够访问

image.png 并且继承该类的子类并不能访问,如下图所示:

image.png

受保护修饰符

跟私有修饰符很相似,实例对象同样不能访问受保护的属性,如下:

image.png 有一点不同的是 protected 成员在子类中仍然可以访问

image.png