TypeScript——类
ES6之后JS将能够使用基于类的面向对象的方式,TS中的类覆盖了JS中的类
-
基本实现
“类的成员属性”都是实例属性,而不是原型属性,“类的成员方法”都是“原型”方法
class Dog { constructor(name: string) { this.name = name; } name: string // 需要增加成员类型注释 run() {} } console.log(Dog.prototype) // { run: f, constructor: f }
继承与ES不同的是:实例的属性必须有初始值,或者在构造函数中被初始化
派生类从基类中继承属性和方法,用作于类的拓展
class Husky extends Dog { constructor(name: string, color: string) { super(name) // 派生类的构造函数必须包含 "super" 调用 this.color = color; // 访问派生类的构造函数中的 "this" 前,必须调用 "super" } color: string }
-
修饰符
修饰符 | 含义 | 作用 |
---|---|---|
public | 公共成员(默认) | 对所有类可见 |
private | 私有成员 |
只能在类本身调用 而不能在实例/子类中调用; 构造函数使用则该类不可实例化和继承; |
protected | 被保护成员 |
可在类本身及子类调用,而不能在实例中调用; 构造函数使用则该类不可实例化,只能被继承; |
readonly | 只读成员 | 一定需要初始化,不可修改 |
static | 静态成员 | 只能通过类名调用(实例化对象no),可被继承 |
-
抽象类:只能被继承,而不能被实例化(对ES的拓展)
// 抽象类:抽离出一些类的共性,有利于代码的复用和拓展 可实现多态 abstract class Animal { eat() { console.log('eat') } abstract sleep(): void // 在抽象类中可以定义抽象函数 } // let animal = new Animal() 无法创建抽象类的实例 // class Bird extends Animal { sleep() { // 在子类中做不同的操作,从而实现多态 console.log('Bird sleep') } }