学习JavaScript设计模式之迭代器模式


Posted in Javascript onJanuary 19, 2016
  • 迭代器模式是指提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。

JavaScript中的Array.prototype.forEach

一、jQuery中的迭代器

$.each([1, 2, 3], function(i, n) {
  console.log("当前下标为:"+ i + " 当前元素为:"+ n );
});

二、实现自己的迭代器

var each = function(ary, callback) {
  for(var i = 0, l = ary.length; i < l; i++) {
    callback.call(ary[i], i, ary[i]);
  }  
};
each([1, 2, 3], function(i, n) {
  console.log("当前下标为:"+ i + " 当前元素为:"+ n );
});

注意:区别于Array.prototype.forEach的参数!!!

[1, 2, 3].forEach(function(n, i, curAry){
  console.log("当前下标为:"+ i + " 当前元素为:"+ n + " 当前数组为:" + curAry);
})

三、内部迭代器、外部迭代器

(1)内部迭代器:已经定义好了迭代规则,它完全接手整个迭代过程,外部只需一次初始调用。上述自定义each即为内部迭代器!
(2)外部迭代器:必须显示地请求迭代下一个元素。
示例:判断两个数组是否相等

示例一:内部迭代器

// 内部迭代器
var each = function(ary, callback) {
  for(var i = 0, l = ary.length; i < l; i++) {
    callback.call(ary[i], i, ary[i]);
  }  
};
// 比较函数
var compareAry = function(ary1, ary2) {
  if(ary1.length != ary2.length) {
    throw new Error("不相等"); // return console.log("不相等"); 
  }
  // 且住
  each(ary1, function(i, n) {
    if(n !== ary2[i]) {
      // return console.log("不相等"); 
      // return 只能返回到each方法外,后续console.log("相等")会继续执行,所以这里得使用throw
      throw new Error("不相等");
    }
  });
  console.log("相等");
}

compareAry([1, 2, 3], [1, 2, 4]);

示例二:外部迭代器

// 外部迭代器
var Iterator = function(obj) {
  var current = 0,
    next = function() {
      current++;
    },
    isDone = function() {
      return current >= obj.length;  
    },
    getCurrentItem = function() {
      return obj[current];
    };
  return {
    next: next,
    isDone: isDone,
    getCurrentItem: getCurrentItem
  };
};
// 比较函数
var compareAry = function(iterator1, iterator2) {
  while( !iterator1.isDone() && !iterator2.isDone() ){
    if(iterator1.getCurrentItem() !== iterator2.getCurrentItem()) {
      throw new Error("不相等");
    }
    iterator1.next();
    iterator2.next();
  }
  console.log("相等");
}

compareAry(new Iterator([1, 2, 3]), new Iterator([1, 2, 4]));

四、终止迭代器

var each = function(ary, callback) {
  for(var i = 0, l = ary.length; i < l; i++) {
    if(callback.call(ary[i], i, ary[i]) === false) {
      break;
    }
  }
}

each([1, 2, 4, 1], function(i, n) {
  if(n > 3) {
    return false;
  }
  console.log(n);
});

五、应用(落地)

文件上传,根据不同的浏览器获取相应的上传组件对象。
对比《JavaScript设计模式?责任链模式》

var iteratorUploadObj = function() {
  for(var i = 0, fn; fn = arguments[i]; i++) {
    var uploadObj = fn();
    if(uploadObj !== false) {
      return uploadObj;
    }
  }
};

var uploadObj = iteratorUploadObj(getActiveUploadObj, getFlashUploadObj, getFormUploadObj);

function getActiveUploadObj() {
  try{
    return new ActiveObject("TXFTNActiveX.FTNUpload"); // IE上传控件
  }catch(e) {
    return false;
  }
}

function getFlashUploadObj() {
  if(supportFlash().f === 1) {
    var str = '<object type="application/x-shockwave-flash"></object>';
    return $(str).appendTo($("body"));
  }
  return false;
}

function getFormUploadObj() {
  var str = '<input name="file" type="file" class="ui-file" />';
  return $(str).appendTo($("body"));
}

// 是否支持flash
function supportFlash() {
  var hasFlash = 0; //是否安装了flash
  var flashVersion = 0; //flash版本
  if (document.all) {
    var swf = new ActiveXObject('ShockwaveFlash.ShockwaveFlash');
    if (swf) {
      hasFlash = 1;
      VSwf = swf.GetVariable("$version");
      flashVersion = parseInt(VSwf.split(" ")[1].split(",")[0]);
    }
  } else {
    if (navigator.plugins && navigator.plugins.length > 0) {
    var swf = navigator.plugins["Shockwave Flash"];
      if (swf) {
        hasFlash = 1;
        var words = swf.description.split(" ");
        for (var i = 0; i < words.length; ++i) {
          if (isNaN(parseInt(words[i]))) continue;
          flashVersion = parseInt(words[i]);
        }
      }
    }
  }
  return { f: hasFlash, v: flashVersion };
}

希望本文所述对大家学习javascript程序设计有所帮助。

Javascript 相关文章推荐
asp.net HttpHandler实现图片防盗链
Nov 09 Javascript
js实现的折叠导航示例
Nov 29 Javascript
Event altKey,ctrlKey,shiftKey属性解析
Dec 18 Javascript
JavaScript设计模式之单例模式实例
Sep 24 Javascript
TypeError document.getElementById(...) is null错误原因
May 18 Javascript
用jquery的attr方法实现图片切换效果
Feb 05 Javascript
使用jQuery实现购物车结算功能
Aug 15 jQuery
vue仿element实现分页器效果
Sep 13 Javascript
使用ng-packagr打包Angular的方法示例
Sep 21 Javascript
vue-quill-editor+plupload富文本编辑器实例详解
Oct 19 Javascript
微信小程序把百度地图坐标转换成腾讯地图坐标过程详解
Jul 10 Javascript
微信小程序自定义tabBar的踩坑实践记录
Nov 06 Javascript
学习JavaScript设计模式之观察者模式
Apr 22 #Javascript
JS获取CSS样式(style/getComputedStyle/currentStyle)
Jan 19 #Javascript
详解javascript实现自定义事件
Jan 19 #Javascript
JS拖拽组件学习使用
Jan 19 #Javascript
理解JS绑定事件
Jan 19 #Javascript
AngularJS模块学习之Anchor Scroll
Jan 19 #Javascript
jQuery unbind()方法实例详解
Jan 19 #Javascript
You might like
PHP 一个页面执行时间类代码
2010/03/05 PHP
php设计模式 Proxy (代理模式)
2011/06/26 PHP
从手册去理解分析PHP session机制
2011/07/17 PHP
MySQL的FIND_IN_SET函数使用方法分享
2012/03/27 PHP
php实现的替换敏感字符串类实例
2014/09/22 PHP
ECSHOP在PHP5.5及高版本上报错的解决方法
2015/08/31 PHP
PHP 二维array转换json的实例讲解
2018/08/21 PHP
php 多继承的几种常见实现方法示例
2019/11/18 PHP
网页中实现浏览器的最大,最小化和关闭按钮
2007/03/12 Javascript
javascript tips提示框组件实现代码
2010/11/19 Javascript
利用jQuery实现一个简单的表格上下翻页效果
2017/03/14 Javascript
Vue.js展示AJAX数据简单示例讲解
2017/03/29 Javascript
js禁止表单重复提交
2017/08/29 Javascript
vue 之 .sync 修饰符示例详解
2018/04/21 Javascript
JS实现调用本地摄像头功能示例
2018/05/18 Javascript
vue2中使用sass并配置全局的sass样式变量的方法
2018/09/04 Javascript
js canvas实现橡皮擦效果
2018/12/20 Javascript
深入浅析golang zap 日志库使用(含文件切割、分级别存储和全局使用等)
2020/02/19 Javascript
Python输出9*9乘法表的方法
2015/05/25 Python
Python爬虫实现全国失信被执行人名单查询功能示例
2018/05/03 Python
Python检测网络延迟的代码
2018/05/15 Python
python实现梯度下降算法
2020/03/24 Python
使用k8s部署Django项目的方法步骤
2019/01/14 Python
详解Python 字符串相似性的几种度量方法
2019/08/29 Python
pandas 缺失值与空值处理的实现方法
2019/10/12 Python
Python3 sys.argv[ ]用法详解
2019/10/24 Python
Python(PyS60)实现简单语音整点报时
2019/11/18 Python
Python字符串hashlib加密模块使用案例
2020/03/10 Python
详解pytorch tensor和ndarray转换相关总结
2020/09/03 Python
详解css3 mask遮罩实现一些特效
2018/10/24 HTML / CSS
英国最大的美妆产品在线零售商之一:Beauty Bay
2017/09/29 全球购物
俄罗斯达美乐比萨外送服务:Domino’s Pizza
2020/12/18 全球购物
旷课检讨书3000字
2014/02/04 职场文书
幼儿园的门卫岗位职责
2014/04/10 职场文书
颐和园英文导游词
2015/01/30 职场文书
暑期实践个人总结
2015/03/06 职场文书