介绍
- 顺序访问一个集合
- 使用者无需知道集合的内部结构(封装)
示例
生活中暂无形象示例来说明迭代器模式。
UML类图
代码演示
class Iterator {
constructor(container) {
this.list = container.list;
this.index = 0;
}
next() {
if (this.hasNext()) {
return this.list[this.index++];
}
return null;
}
hasNext() {
if (this.index >= this.list.length) {
return false;
}
return true;
}
}
class Container {
constructor(list) {
this.list = list;
}
// 生成遍历器
getIterator() {
return new Iterator(this);
}
}
let arr = [1, 2, 4, 5, 6];
let container = new Container(arr);
let iterator = container.getIterator();
while(iterator.hasNext()) {
console.log(iterator.next());
}
场景
- jQuery的each函数
- ES6 Iterator
ES6 Iterator为何存在?
- ES6语法中,有序集合的数据类型已经有很多
- Array Map Set String TypedArray arguments Nodelist
- 需要有一个统一的遍历接口来遍历所有数据类型
- (注意,object不是有序集合,可以用Map代替)
ES6 Iterator是什么?
- 以上数据类型,都有[Symbol.iterator]属性
- 属性值是函数,执行函数返回一个迭代器
- 这个迭代器就有next方法可顺序迭代子元素
- 可运行Array.prototype[Symbol.iterator]来测试