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

类型测试操作符
操作符描述
asTypecase(类型转换)
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';
Assert(断言)
  • assert语句只在检测模式下有效,在生产模式下无任何效果
  • 使用assert语句检测执行条件。如果条件是false,则中断执行并抛出异常(AssertionError
Class
  • 当想在对象上执行多个操作时可以使用级联操作符(..

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

    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);
        }
      }
    }
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值