1.迭代器模式
迭代器模式是指提供一种方法顺序访问一个聚合对象中的各个元素,而不需要暴露该对象的内部表示。
作用:迭代器模式可以把迭代的过程从业务逻辑中分离出来,在使用迭代器模式后,即是不关心对象的内部构造,也可以按顺序访问其中的每个元素。
2.迭代器的两种实现
- 内部迭代器
内部迭代器就是函数内部已经定义好了迭代的整个规则,全接手整个迭代过程,外部只需要一次初始调用。
内部迭代器调用方便,外部不用关心迭代的过程,但是迭代规则已经写死,用法不太灵活。
//数组的each内部迭代器
function each(array,func){
for(var i=0,len=array.length;i<len;i++){
func.call(array[i],i,array[i]);
}
}
each([1,2,3],function(index,item){
console.log(item);
});
- 外部迭代器
外部迭代器就是将迭代的每一个过程分别封装成一个个小函数进行调用,可以非常方便地控制迭代的每一个过程,同时也可以提前终止迭代。
//数组的外部迭代器
var iterator=function(obj){
var current=0;
function next(){
current++;
}
function isDone(){
return current>=obj.length;
}
function getCurItem(){
return obj[current];
}
function reset(){
current=0;
}
return {
next: next,
isDone: isDone,
getCurItem: getCurItem,
reset: reset
};
}
function compare(a,b){
while(!a.isDone() && !b.isDone()){
if(a.getCurItem()!==b.getCurItem()){
return false;
}
a.next();
b.next();
}
return true;
}
var a=iterator([1,2,3]);
var b=iterator([1,2,3]);
console.log(compare(a,b));
3.迭代器模式的应用
例如要实现浏览器上传功能,使用浏览器的上传控件进行上传,速度快,可以暂停和续传,需要判断是否有上传控件,没有的话就用flash上传,如果没有flash上传,那就只能用原生的表单上传。
那么可以使用三个函数来分别判断每种方式的可行性,如果对象可用就返回该对象,如果不可用,则返回false,提示继续向后迭代。
//获取IE上传组件
function getActive(){
return false;
}
//获取flash上传控件
function getFlash(){
return false;
}
//获取表单上传控件
function getForm(){
return {};
}
//获取上传组件对象
function iteratorUpload(){
for(var i=0,len=arguments.length;i<len;i++){
var value=arguments[i]()
if(value!==false){
return value;
}
}
}
var uploadObj=iteratorUpload(getActive,getFlash,getForm);