这是我参与11月更文挑战的第19天,活动详情查看:2021最后一次更文挑战
传统的JavaScript程序使用函数和基于原型的继承来创建可重用的组件,ECMAScript 6开始,JavaScript程序员将能够使用基于类的面向对象的方式。使用TypeScript,我们允许开发者现在就使用这些特性,并且编译后的JavaScript可以在所有主流浏览器和平台上运行,而不需要等到下个JavaScript版本。
类
概念
虽然 JavaScript 中有类的概念,但是可能大多数 JavaScript 程序员并不是非常熟悉类,这里对类相关的概念做一个简单的介绍。
- 类(Class):定义了一件事物的抽象特点,包含它的属性和方法
- 对象(Object):类的实例,通过
new生成 - 面向对象(OOP)的三大特性:封装、继承、多态
- 封装(Encapsulation):将对数据的操作细节隐藏起来,只暴露对外的接口。外界调用端不需要(也不可能)知道细节,就能通过对外提供的接口来访问该对象,同时也保证了外界无法任意更改对象内部的数据
- 继承(Inheritance):子类继承父类,子类除了拥有父类的所有特性外,还有一些更具体的特性
- 多态(Polymorphism):由继承而产生了相关的不同的类,对同一个方法可以有不同的响应。比如
Cat和Dog都继承自Animal,但是分别实现了自己的eat方法。此时针对某一个实例,我们无需了解它是Cat还是Dog,就可以直接调用eat方法,程序会自动判断出来应该如何执行eat* 存取器(getter & setter):用以改变属性的读取和赋值行为 - 修饰符(Modifiers):修饰符是一些关键字,用于限定成员或类型的性质。比如
public表示公有属性或方法 - 抽象类(Abstract Class):抽象类是供其他类继承的基类,抽象类不允许被实例化。抽象类中的抽象方法必须在子类中被实现
- 接口(Interfaces):不同类之间公有的属性或方法,可以抽象成一个接口。接口可以被类实现(implements)。一个类只能继承自另一个类,但是可以实现多个接口
参考:ts.xcatliu.com/advanced/cl…
示例:
class Car{
switchRadio(trigger:boolean){
}
}
类实现接口
实现(implements)是面向对象中的一个重要概念。一般来讲,一个类只能继承自另一个类,有时候不同类之间可以有一些共有的特性,这时候就可以把特性提取成接口(interfaces),用 implements 关键字来实现。这个特性大大提高了面向对象的灵活性。
示例:
interface Radio{
switchRadio(trigger:boolean):void;
}
class Car implements Radio{
switchRadio(trigger:boolean){
}
}
class Cellphone implements Radio{
switchRadio(trigger:boolean){
}
}
如果我们没有在类里面使用方法会报错:
interface Radio{
switchRadio(trigger:boolean):void;
}
class Car implements Radio{
}
class Cellphone implements Radio{
switchRadio(trigger:boolean){
}
}
报错信息:
多个接口调用:
interface Radio{
switchRadio(trigger:boolean):void;
}
interface Battery{
checkBatteryStatus():void;
}
class Car implements Radio{
switchRadio(trigger:boolean){
}
}
class Cellphone implements Radio,Battery{
switchRadio(trigger:boolean){
}
checkBatteryStatus(){
}
}
接口继承
在面向对象的世界中一个类只能继承另一个类,有时候不同类之间可以有一些共同的特性,使用子类继承父类的方法很难来完成 ,这个时候我们可以把类提取成接口来实现。因为接口和类一样,接口也可以相互继承。 这让我们能够从一个接口里复制成员到另一个接口里,可以更灵活地将接口分割到可重用的模块里。
interface Radio{
switchRadio(trigger:boolean):void;
}
interface Battery{
checkBatteryStatus():void;
}
interface RadioWithBattery extends Radio{
checkBatteryStatus():void;
}
class Car implements Radio{
switchRadio(trigger:boolean){
}
}
class Cellphone implements RadioWithBattery{
switchRadio(trigger:boolean){
}
checkBatteryStatus(){}
}
总结:
- 在TypeScript中类可以使用implements来实现接口
- 接口和类一样,接口也可以相互继承