ECMAScript 5 中的近类结构
ECMAScript 5 及早期版本中没有类的概念,最相近的思路是创建一个自定义类型:首先创建一个构造函数,然后定义另一个方法并赋值给构造函数的原型。例如:
|
|
许多模拟类的 JS 库都是基于这个模式进行开发,而且 ECMAScript 6 中的类也借鉴了类似的方法。
类声明
ECMAScript 6 有一种与其他语言中类似的类特性:类声明,同时,它也是 ECMAScript 6 中最简单的类形式。
基本的类声明语法
要声明一个类,首先编写 class 关键字,紧跟着的是类的名字,其他部分的语法类似于对象字面量方法的简写形式,但不需要在类的各元素之间使用逗号分隔。
|
|
类表达式
基本的类表达式语法
|
|
类声明和类表达式功能相似,二者最重要的区别是 name 属性不同,匿名类表达式的 name 属性值是一个空字符串,而类声明的 name 属性值为类名。
命名类表达式
|
|
静态成员
ECMAScript 5 及早期版本中,直接将方法添加到构造函数中来模拟静态成员是一种常见的模式。
|
|
ECMAScript 6 的类语法简化了创建静态成员的过程,在方法或访问器属性名前使用正式的静态注释即可。
|
|
不可在实例中访问静态成员,必须要直接在类中访问静态成员
继承与派生类
|
|
类的出现让我们可以更轻松地实现继承功能,使用熟悉的 extends 关键字可以指定类继承的函数。原型会自动调整,通过调用 super() 方法即可访问基类的构造函数。以下为上段示例的等价版本:
|
|
继承自其他类的类被称作派生类,如果在派生类中指定了构造函数则必须要调用 super(),如果不这样程序就会报错。如果选择不使用构造函数,则当创建新的类实例时会自动调用 super() 并传入所有参数。
类方法遮蔽
派生类中的方法总会覆盖基类中的同名方法。
|
|
如果想调用基类中的该方法,则可以调用 super.getArea() 方法,就像这样:
|
|