在 ES6 问世之前,广泛流行的 JS 面向对象编程是使用原型链而非使用类,开发者需要对相关特性有足够的了解,并遵循一些默认的规则,才能勉强模拟出一个大致可用的“类”。
即便是 ES6 引入了 class
关键字来弥补,作为新一代 JS 基础设施的类还是有待完善。相比之下,Dart 对类的支持就要完善和强大得多。
一. 相似的整体结构
-
两种语言中,用于定义类的语法结构高度相似,主要包括
class
关键字、类名、包裹在花括号{}
内部的成员。> /* Both JS and Dart */ > class ClassName { > attrA; > attrB = 1; > > methodA(a, b){ > // do something > this.attrA = a; > this.attrB = b; > } > }
二. 构造函数
相同之处
- 构造函数在实例化类的时候调用,用于处理实例化参数、初始化实例属性等;
- 使用
super
访问超类的构造函数; - 没有超类,或超类的构造函数没有参数的时候,构造函数可以省略,省略构造函数的子类实例化的时候会隐式地调用超类的构造函数。
不同之处
1. constructor
vs SameName
- JS 中的构造函数为
constructor
; - Dart 中的构造函数为与类名一致的函数。
> /* JS */ | /* Dart */
> class Point{ | class Point{
> constructor(){ | Point(){
> } | }
> } | }
Dart 构造函数特有的性质
命名式构造函数
-
在 Dart 中可以为一个类声明多个命名式构造函数,来表达更明确的意图,比如将一个
Map
对象映射为一个实例:> class PointCanBeEncode{ > int x = 0; > > // 名为 `eval` 的命名式构造函数 > Point.eval(Map<String, dynamic> map){ > x = map['x']; > } > > encode(): Map<String, dynamic>{ > return { > 'x': this.x > } > } > }
2. 属性赋值语法糖
-
大多数情况下,构造函数的作用包括将给定的值作为实例的属性, Dart 为此情形提供了一个十分方便的语法糖:
> /* Dart */ | /* Also Dart */ > class