操作符 | 描述 |
---|---|
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); } } }