代码改变世界

js设计模式--迭代器模式

2013-09-17 16:57  明朝  阅读(328)  评论(1编辑  收藏  举报

迭代器模式:

迭代器模式提供一种方法顺序访问一个聚合对象中各个元素,而又不需要暴露该方法中的内部表示。js中我们经常会封装一个each函数用来实现迭代器。

理解的意思:提供一个方法,去把对象的每一项按照一定的方法,访问各个元素。

上代码:

var agg = ((function(){
    var index = 0,
    arr = [1,2,3,4,5,6],
    length = arr.length;

    return {
        next:function(){                     //向下进行
            var ele;
            if(!this.hasNext) return null;   //当索引值大于集合的length时判断停止
            ele = arr[index];                //获取的元素
            index = index +2;                //索引
            return ele;                        //返回查找到的元素
        },
        hasNext:function(){                 //判断是否已经找完了
            return index<length;
        },
        rewind:function(){                    //把指针归零重置
            index=0;
        },
        current:function(){                    //返回指定的数值
            return arr[index]
        }
    }

})())

 执行:

while (agg.hasNext()) {
    console.log(agg.next());  // 1,3,5
}

 

 当然,你也可以通过额外的方法来重置数据,然后再继续其它操作:

// 重置
agg.rewind();
console.log(agg.current()); // 1

 

在jQuery这种也有这样的形式,比如each,

$.each([1, 2, 3, 4], function (index, value) {
    console.log(index + ': ' + value);
});

 

写了个例子,操作数组:

function each(arr,callBack){
    for(var i=0;i<arr.length;i++){
        if(callBack.call(arr[i],i,arr[i]) === false){
                      return false;
            }
    }

};
var as = [1,2,3,4,5];
each(as,function(index,item){
    console.log(index);//0,1,2,3,4
}); 

 

写了个例子,操作对象:

function each(arr,callBack){

  for(var i in arr ){
    if(callBack.call(arr[i],i,arr[i]) === false){
      return false;
    }
  }

}


var as = {a:1,b:2,c:3,d:4};

each(as,function(index,item){

console.log(index);a,b,c,d

});

 

迭代器的使用场景是:对于集合内部结果常常变化各异,我们不想暴露其内部结构的话,但又响让客户代码透明底访问其中的元素,这种情况下我们可以使用迭代器模式。

参考:《javascript设计模式》

汤姆大叔:http://www.cnblogs.com/TomXu/archive/2012/03/09/2358903.html