JavaScript 设计模式之迭代器模式

作者: tww844475003 分类: 前端开发 发布时间: 2021-06-20 12:44

迭代器模式

迭代器模式是指提供一种方法顺序访问一个聚合对象中的各个元素,页不需要暴露该对象的内部表示。迭代器模式可以把迭代的过程从业务逻辑中分离出来,在使用迭代器模式之后,即使不关心对象的内部构造,也可以按顺序访问其中的所有元素。
  • 内部迭代器

它完全接手整个迭代过程,外部只需要一次初始调用,仅是一次初始调用,这也是内部迭代器的缺点。

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)
前端开发那点事
微信公众号搜索“前端开发那点事”

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注