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)



