一、认识类的使用
在早期的javascript
开发中我们需要通过函数和原型链来实现类的继承,从ES6
开始,引入class
关键字,可以更加方便的定义和使用类。
Typescript
作为javascript
的超集,也是支持使用class
关键字的,并且还就可以对类的属性和方法等进行静态类型检测。
实际上在JavaScript
的开发过程中,我们更加习惯于函数式编程,比如比如React开发中,目前更多使用的函数组件以及结合Hook的开发模式;比如在Vue3开发中,目前也更加推崇使用 Composition API;
。
类的定义我们通常会使用class
关键字,在面向对象的世界里,任何事物都可以使用类的结构来描述,类中包含特有的属性和方法。
二、类的定义
如上图所示,为一个基本的类的定义,如果我们想要在constructor
中通过this.name
拿到属性,我们必须要在类中进行声明,这一点和javascript
中是不一样的。
三、类的继承
上述代码我们通过extends
实现继承。
如上述代码所示,我们使用super
和extends
关键字来实现继承和参数传给父类。
四、类的多态
什么是类的多态,就是一个类的不同状态,如上所示代码,Fish
和Dog
分别继承Animal
,并且对其内部的actions
的方法存在不同的实现。这就是多态。
五、类的成员修饰符
类中存在三种成员修饰符,分别是public
,private
,protected
。下面将对其进行分别演示。
public修饰符:
public
修饰的属性就是任何地方都是可以访问到的,默认编写的就是public
修饰符。
private修饰符
如上述代码所示,此时我们给name
属性设置private
关键字,此时我们不可以在外部访问name
,包括也不能在子类中使用该属性。如果我们想要访问和设置该属性的话,我们可以设置setName
,getName
两个函数来实现name
属性和外部通信。
protected修饰符:
如上图所示,我们给name
属性设置protected
修饰符,表示该属性被保护起来了,只能在该类内部和其子类中使用,其他地方均不能使用。
六、只读属性readonly
如上图所示,此时我们给属性设置readonly
时,需要注意以下几点:1、readonly的属性可以在构造器中进行赋值,赋值之后不能修改
,2、如果一个属性设置readonly,则不能更改,如果我们给一个对象设置readonly属性,则其内部的属性是可以修改的。
七、getters/setters
我们可以使用getters和setters
来对private
属性来进行赋值。
八、静态成员
以前我们不使用静态成员的话,则必须进行实例化类后,才能调用该类上面的方法和访问到该类上面的属性。现在我们可以使用static
属性来设置属性名和方法,我们可以直接通过类名
来访问。
九、抽象类abstract
如上图所示,我们实现一个抽象类,然后抽象类中存在一个抽象方法,抽象方法在抽象类中是不存在实现的,我们需要在不同的继承类中实现该方法。如果在继承中我们使用到构造函数,此时我们应该首先调用super()
,来调用父类的构造函数。抽象类存在以下几个特征点:1、必须使用abstract
,2、抽象类不能被实例化,也就是不能使用new关键字
,3、抽象方法必须使用abstract关键字,并且在该抽象类中可以不实现
。
十、类的类型
类可以作为数据类型的,如上图所示,我们将Person
作为p1
的类型,此时p1
必须完全按照Person
的类型来进行约束。