JS设计模式——迭代器模式

  迭代器模式是提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。迭代器模式可以把迭代的过程从业务逻辑中分离出来,使用者不必关心对象的内部构造。

迭代器可分为内部迭代器外部迭代器。内部迭代器在内部定义好了迭代规则,外部调用时不用关心迭代器的具体实现,其缺点是功能被固定,不易扩展。外部迭代器必须显式地请求迭代下一个元素,更加灵活。

一、内部迭代器

这里实现一个迭代数组类对象的each迭代器,迭代器接收一个数组和一个回调函数,返回数组的索引和值。

1
2
3
4
5
6
7
8
9
10
var each=function(arr,fn){
for(var i=0;i<arr.length;i++){
fn.call(i,i,arr[i]); //第一个参数i可以是this,也可以是[],为了提高性能,选择一个已有的对象i
}
};

//使用
each([1,2,5],function(i,n){
//dosomething
});

二、外部迭代器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
var Itetator=function(obj){
var current=0; //标记当前迭代器的位置

var next=function(){
current+=1;
};

var isDone=function(){
return current>=obj.lenght;
};

var getCurrItem=function(){
return obj[current];
};

return{
next:next, //迭代器移动一步的方法
isDone:isDone,
getCurrItem:getCurrItem
};
};

迭代器可以迭代数组或者对象,对象中的元素类型各一,更宽泛的,迭代器也可以迭代传入的形参,而不必是一个封装好的数组或对象。