首页 > 建站教程 > dart >  Dart语法(二):操作符及构造函数正文

Dart语法(二):操作符及构造函数

1、类型测试操作符
操作符 描述
as Typecase(类型转换)
is 如果对象是该类型,则返回true
is! 如果对象是该类型,则返回false

    is的使用如下:如果person是null或不是一个Person,则不执行判断里的语句
if (person is Person) { // Type check
     person.firstName = 'Bob';
}
    as的使用如下:如果person是null或不是一个Person,则会抛出异常
(person as Person).firstName = 'Bob';
2、Assert(断言)
    assert语句只在检测模式下有效,在生产模式下无任何效果
    使用assert语句检测执行条件。如果条件是false,则中断执行并抛出异常(AssertionError)

3、级联操作符
    当想在对象上执行多个操作时可以使用级联操作符(..)
querySelector('#button')
    ..text = 'Click to Confirm'                        // Get an object. Use its
    ..classes.add('important')                         // instance variables
    ..onClick.listen((e) => window.alert('Confirmed!')); // and methods.
4、实例变量
    如果在定义实例变量时设置它的值,而不是在构造函数或其他函数中赋值,则赋值操作发生在构造函数和初始化列表执行之前

5、构造函数
①、构造函数参数赋值
class Point {
  num x;
  num y;

  Point(num x, num y) {
    // 这种初始化赋值操作还有更好的实现方式,请往下看!
    this.x = x;
    this.y = y;
  }
}
    可以简写为(语法糖)
class Point {
  num x;
  num y;

  // 在构造函数体执行之前设置实例变量的语法
  Point(this.x, this.y);
}
②、构造函数不支持继承

③、命名构造函数
    用命名构造函数提供多个构造函数或提供更加清晰的信息
class Point {
  num x;
  num y;

  Point(this.x, this.y);

  // 命名构造函数
  Point.fromJson(Map json) {
    x = json['x'];
    y = json['y'];
  }
}
    如果父类没有无名无参数的默认构造函数,则子类必须手动调用一个父类构造函数。在:后面构造函数体之前指定要调用的父类构造函数
class Person {
  Person.fromJson(Map data) {
    print('in Person');
  }
}

class Employee extends Person {
  // Person 没有默认构造函数
  // 所以必需指定 super.fromJson(data) 构造函数
  Employee.fromJson(Map data) : super.fromJson(data) {
    print('in Employee');
  }
}

main() {
  var emp = new Employee.fromJson({});

  // 打印结果:
  // in Person
  // in Employee
}
④、重定向构造函数
    有些构造函数只是调用同一个类中的另外一个构造函数
class Point {
  num x;
  num y;

  Point(this.x, this.y);                // 该类的主要构造函数
  Point.alongXAxis(num x) : this(x, 0); // 调用主要构造函数
}
⑤、常量构造函数
    如果类生成从来不改变的对象,则可以把这些对象定义为编译器常量。用一个const构造函数赋值为实例变量,并将实例变量设置为final来实现
class ImmutablePoint {
  final num x;
  final num y;
  const ImmutablePoint(this.x, this.y);
  static final ImmutablePoint origin = const ImmutablePoint(0, 0);
}
⑥、工厂构造函数
    如果一个构造函数并不总是要创建新的对象(或从缓存中返回实例),可以用factory关键字修饰构造函数
class Logger {
  final String name;
  bool mute = false;

  // _cache is library-private, thanks to the _ in front of its name.
  static final Map<String, Logger> _cache = <String, Logger>{};

  factory Logger(String name) {
    if (_cache.containsKey(name)) {
      return _cache[name];
    } else {
      final logger = new Logger._internal(name);
      _cache[name] = logger;
      return logger;
    }
  }

  Logger._internal(this.name);

  void log(String msg) {
    if (!mute) {
      print(msg);
    }
  }
}