欢迎光临散文网 会员登陆 & 注册

TypeScript 高级语法——Class(二)

2023-08-08 14:36 作者:没用软件开发日记  | 我要投稿

     关于类分成多篇文章发出,ES为了面向对象增加非常多的思维维度。

    这个例子中使用了关键字“extends”,该关键字表示class的继承,也就是说Person类会获得Base中的所有公开(public修饰符修饰的,未声明则默认public)、受保护(protected修饰符修饰的)成分(字段name、方法say)作为自己的组成部分(Person包含Base所有的组成元素),这里所说的作为自己的组成部分其实是方便理解的一种说法,真实情况是我们可以通过Person去访问Base的公开、受保护对象。

    受保护修饰符protected的意思为只可以在直接派生类中使用,也就是说类实例不可访问,但是类函数内部可以访问。这里要注意一点,TS的访问保护系统与其他OOP不同的是只能对直接父级受保护对象发起访问,不可跨级。

    与TypeScript类型系统的其他方面一样,private和protected只在类型检查期间强制执行,TS在ES2021之前会将私有对象用WeekMap翻译,2021之后会使用ES的私有标记,也就是说protected修饰符编译后的JS代码不会有可访问检查能力。

    第二个重点是构造函数construct内部的super函数,它意味着调用上级构造函数,也就是说super其实是对Base类构造函数(Base未声明构造函数则获得了一个默认的空函数为构造函数)的调用,所以这样理解的话就很轻松的能明白为什么在super执行之前无法使用this,因为当前类的父级还未被初始化成功,也就是说当前类存在缺陷无法正常提供服务。

    本例中如果Person也不需要构造函数则可以省略,不必显示的在Person中写一个构造函数去执行super,默认的构造函数会代替我们执行这一过程。

    示例中使用this.k在构造时为Person类添加公开字段,这种做法现在有更好的替代方案,就如Base类内部name字段的声明一样,对开发人员来讲这是一个关注点分离的逻辑,开发人员可以在固定的地方知道自己想知道的所有东西,而不是依靠类内部随时可能出现的“this.”动态追加。

    访问类内部字段只能使用“this”,类内部出现的this在不被解包的场景下会指向本级类(Person内部的this指向Person,Base内部的this指向Base,因为Person可以访问Base的公开对象,所以Person内部的this可以访问到Base的公开部分但是访问不到Base的私有部分)。

    Base中的age字段前的#是ES规范里对private访问修饰符的表示方法,所以私有字段是真实存在的,这一点和受保护字段完全不同。

  TS类型系统还为Class提供了索引的类型描述,上例通过将索引的返回值标记为boolean和返回布尔值的函数规定了类内部的组成成分。

    这个示例展示了属性访问器的写法,它和方法很像只不过多了一个关键字修饰。“get”关键字标记只读访问器、“set”关键字标记只写访问器,get和set可以不成对存在(只存在只读访问器或者只存在只写访问器)。

    当类内get访问器没有对应的set访问器时,试图去修改只读访问器的结果在编码阶段TS会提示错误,在编译后浏览器环境会忽略此次赋值无任何警告、报错。

    属性访问器其实本质上是一种代理模式,通过对写动作的拦截增加写的逻辑、对读动作的拦截用对象本身的字段组成新的数据格式。

      类一样可以被接口约束,这里使用关键字“implements”表示Sonar类遵从于接口Pingable的约束,也就是说Sonar必须实现签名为“ping( ): void;”的函数,如上例中所示:Sonar类中具有一个名为ping的函数,无参无返回值。

    该示例中的字段类型覆写意为DogHouse虽然继承了AnimalHouse但是resident的类型从Animal改为Dog。

    这个示例中体现的是字段的覆写,但是这种做法可能出乎初学者的意料,ES标准中类型的初始化过程是这样的:

    1、Base初始化字段

    2、Base的构造函数运行

    3、Derived初始化字段,在这个过程中Derived发现name字段有值则跳过默认值赋予的过程

    4、Derived构造函数运行

所以才会出现name的值是base的结果,如果我们希望派生类的字段可以覆写基类name应该在构造函数中执行赋值动作。

    这个例子中两个类的name字段访问修饰符都是public,如果Base的访问修饰符可访问级别小于public,Derived的name字段的访问修饰级别public将会覆盖原有级别,在Derived实例中就可以访问Base实例访问不到的name字段了。

    上例为类静态字段,这些成员不与类的特定实例相关联。它们可以通过类构造函数对象本身来访问。使用方式如上例的printX,通过类名直接调用,静态字段前也可以增加访问修饰符,确保只能在类内部使用。


TypeScript 高级语法——Class(二)的评论 (共 条)

分享到微博请遵守国家法律