Dart 的深入研究,这些问题你不能错过

在 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 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值