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