JavaScript 设计模式之迭代器模式
迭代器模式
迭代器模式是指提供一种方法顺序访问一个聚合对象中的各个元素,页不需要暴露该对象的内部表示。迭代器模式可以把迭代的过程从业务逻辑中分离出来,在使用迭代器模式之后,即使不关心对象的内部构造,也可以按顺序访问其中的所有元素。
- 内部迭代器
它完全接手整个迭代过程,外部只需要一次初始调用,仅是一次初始调用,这也是内部迭代器的缺点。
var each = function(ary, callback) {
for (var i = 0, len = ary.length; i < len; i++) {
callback.call(ary[i], i, ary[i]);
}
}
each([2, 4, 6], function(i, value) {
console.log(i, value)
})
- 外部迭代器
外部迭代器显示地请求迭代下一个元素,增加了一些调用的复杂度,但相对也增强了迭代器的灵活性。可以手工控迭代的过程或者顺序。
var Iterator = function(obj) {
var pos = 0;
var next = function() {
pos += 1;
}
var isDone = function() {
return pos >= obj.length;
}
var getPosItem = function() {
return obj[pos];
}
return {
next: next,
isDone: isDone,
getPosItem: getPosItem,
length: obj.length
}
}
var iterator1 = Iterator([2, 4, 6]);
console.log(iterator1.getPosItem())
iterator1.next()
console.log(iterator1.getPosItem())
iterator1.next()
console.log(iterator1.getPosItem())
iterator1.next()
- 中止迭代器
var each = function(ary, callback) {
for (var i = 0, len = ary.length; i < len; i++) {
if (callback(i, ary[i]) === false) {
break;
}
}
}
each([2, 4, 6, 8, 10], function(i, n) {
// n 大于 6 的时候终止循环
if (n > 6) {
return false;
}
console.log(n);
})
- 迭代器模式应用
比如根据不同的浏览器环境,选择不一样的上传方式。
var iteratorUploadObj = function() {
for (var i = 0, fn; fn = arguments[i++];) {
var uploadObj = fn();
if (uploadObj !== false) {
return uploadObj;
}
}
}
var getActiveUploadObj = function() {
try {
return new ActiveXObject('TXFTNActiveX.FTNUpload');
} catch (e) {
return false;
}
}
var getFlashUploadObj = function() {
if (supportFlash()) {
var str = '<object type="application/x-shockwave-flash"></object'>
document.body.appendChild(str);
}
return false;
}
var uploadObj = iteratorUploadObj(getActiveUploadObj, getFlashUploadObj)