在基本掌握Js的语法之后,我们可以进一步学习TypeScript。Ts是Js的超集,也可以理解为扩展集合。Ts提供了面向对象的编程方式,加强了类型检查,并具有很多新特性。
不同于Js是一门解释型语言,Ts是一门编译型语言。Ts代码需要经过编译,并最终转化为Js才能执行。
Ts有很多新概念,下面进行一些介绍。
其中传统Js也可以创建类,但是需要以类似函数的形式。同时,往类里添加方法的时候,需要使用prototype方法进行添加,Ts只需要直接在类里定义函数名即可。
定义一个类之后,我们可以创建类对应的对象。一个类可以有多个对象,类相当于对象的原型。
let a = new className();就可以创建一个对象了。
在定义类的时候,我们可以在类里用constructor定义一个构造方法。
是创建对象的时候立即执行的。可以在constructor函数里进行对象的初始化,同时constructor也可以接受参数。
只需要在属性或方法前加上static关键字,就可以将属性或方法转变为静态。静态属性和方法无法被对象所访问,它专属于类。
关键字为extends。创建子类的时候
class className extends parentClassName()可以继承父类的属性和方法,如果有重复的属性或者方法,子类的属性或者方法会覆盖父类。
关键字为abstract,在父类函数前用该关键字进行修饰,可以建立一个抽象函数。这个函数不能在父类中实现,必须在子类中实现。抽象类无法被实例化,只能被继承。
Ts的类虽然支持继承,但是只能单继承。如果要实现多继承,可以将需要多继承的类写成接口的形式。关键字为interface。一个类创建时只能使用extends继承一个父类,但是可以使用implements关键字连接多个接口。接口内的函数类似于抽象函数,需要在子类中实现,但是接口内函数不需要写abstract关键字。
在类内使用get和set函数对属性的进行包装,从而可以更加安全或者灵活地访问和修改特定属性。在Js中,需要使用defineProperty来进行单个属性的设置,在Ts中,可以直接在类内编写get和set方法。
Ts支持命名空间。在命名空间内定义的类必须使用export关键字导出,对外暴露接口才能在命名空间外被访问。
Ts支持泛型。可以自行定义类型对函数进行操作。function funName
这个栗子中先定义了一个泛型T,规定了传入的参数必须是T类型,函数的返回值也是T类型。
泛型还可以在类中使用。比如Ts支持一个Array
Ts支持字典序访问数组元素。数组元素的本质是键值对。在没有规定键的时候,我们以数组下标index作为数组的键值,用[]访问。如果规定了键,比如
let a = ["name"="张三","age"="18"],就可以通过键来访问到值
a["name"]可以访问到"张三"
Ts支持三种访问修饰符,分别为public,protected,private
public修饰全公开的属性和方法,protected修饰不允许外部访问的属性和方法,但可以允许子类调用。private修饰完全私有的属性和方法,子类也不允许访问。
有时候我们定义的类只需要实例化一个对象即可,这时候可以采用对象单例化。最简单的单例化方式为,在类中定义一个静态变量,将构造方法设置为私有,用静态变量接受构造方法返回的实例化对象。原理为类只能存在一个,静态变量接受实例化对象后也具有唯一性。同时因为将构造方法设置为私有方法,外界无法再实例化一个对象。
当需要实例化的单例对象占用内存较大时,我们可以采用懒加载方式。即只有在调用时才实例化,不调用就不实例化。操作方法为,将上一段提到的静态变量也设置为私有,并且声明它所属的类。
另外写一个静态方法,方法内检测静态变量是否已经实例化,如果实例化返回该实例,如果未实例化则进行实例化再返回。
有时候实现一个功能,需要进行多个模式的切换。比如要进行实现一个计算器,我们可能需要切换加法模式或者减法模式。这个功能可以通过代理模式来实现。通过设计一个通用的接口interface,在interface里面规定好需要实现的函数。然后我们将这个接口通过implement关键字加载到不同的类上。接口也可以视为一个抽象类。接口名可以作为一个独立的类型名。
在主类中定义一个属性来接收接口。实例化主类后,通过设置载有该接口的对象作为主对象的属性,就可以在主对象中调用接口的方法,这个方法不是在接口中实现的,接口只是负责声明。这个方法的具体实现在引入该接口的类上。
通过设置属性监听的接口实现。首先针对主类中的某个属性设置接口,同时用不同的类来导入这个接口,这些类用来实现属性变化后执行的方法。方法应该传入一个参数作为需要监听的属性。然后在主类中建立一个监听器数组。某个属性发生变化后,调用对应的set函数,然后遍历每一个监听器中的接口函数,实现对属性变化的响应。