深入理解JavaScript系列(35):设计模式之迭代器模式详解


Posted in Javascript onMarch 03, 2015

介绍

迭代器模式(Iterator):提供一种方法顺序一个聚合对象中各个元素,而又不暴露该对象内部表示。

迭代器的几个特点是:

1.访问一个聚合对象的内容而无需暴露它的内部表示。
2.为遍历不同的集合结构提供一个统一的接口,从而支持同样的算法在不同的集合结构上进行操作。
3.遍历的同时更改迭代器所在的集合结构可能会导致问题(比如C#的foreach里不允许修改item)。

正文

一般的迭代,我们至少要有2个方法,hasNext()和Next(),这样才做做到遍历所有对象,我们先给出一个例子:

var agg = (function () {

    var index = 0,

    data = [1, 2, 3, 4, 5],

    length = data.length;
    return {

        next: function () {

            var element;

            if (!this.hasNext()) {

                return null;

            }

            element = data[index];

            index = index + 2;

            return element;

        },
        hasNext: function () {

            return index < length;

        },
        rewind: function () {

            index = 0;

        },
        current: function () {

            return data[index];

        }
    };

} ());

使用方法和平时C#里的方式是一样的:
// 迭代的结果是:1,3,5

while (agg.hasNext()) {

    console.log(agg.next());

}

当然,你也可以通过额外的方法来重置数据,然后再继续其它操作:
// 重置

agg.rewind();

console.log(agg.current()); // 1

jQuery应用例子

jQuery里一个非常有名的迭代器就是$.each方法,通过each我们可以传入额外的function,然后来对所有的item项进行迭代操作,例如:

$.each(['dudu', 'dudu', '酸奶小妹', '那个MM'], function (index, value) {

    console.log(index + ': ' + value);

});

//或者

$('li').each(function (index) {

    console.log(index + ': ' + $(this).text());

});

总结

迭代器的使用场景是:对于集合内部结果常常变化各异,我们不想暴露其内部结构的话,但又响让客户代码透明底访问其中的元素,这种情况下我们可以使用迭代器模式。

Javascript 相关文章推荐
层序遍历在ExtJs的TreePanel中的应用
Oct 16 Javascript
JQuery 1.3.2以上版本中出现pareseerror错误的解决方法
Jan 11 Javascript
Javascript中call与apply的学习笔记
Sep 22 Javascript
javaScript实现滚动新闻的方法
Jul 30 Javascript
基于jquery实现复选框全选,反选,全不选等功能
Oct 16 Javascript
javaScript数组迭代方法详解
Apr 14 Javascript
jQuery对象的链式操作用法分析
May 10 Javascript
深入理解jquery自定义动画animate()
May 24 Javascript
浅谈js script标签中的预解析
Dec 30 Javascript
面试常见的js算法题
Mar 23 Javascript
JS实现鼠标拖拽盒子移动及右键点击盒子消失效果示例
Jan 29 Javascript
Node.js开发之套接字(socket)编程入门示例
Nov 05 Javascript
jQuery选择器之基本选择器与层次选择器
Mar 03 #Javascript
JS实现在网页中弹出一个输入框的方法
Mar 03 #Javascript
深入理解JavaScript系列(34):设计模式之命令模式详解
Mar 03 #Javascript
深入理解JavaScript系列(33):设计模式之策略模式详解
Mar 03 #Javascript
JavaScript模拟重力状态下抛物运动的方法
Mar 03 #Javascript
深入理解JavaScript系列(31):设计模式之代理模式详解
Mar 03 #Javascript
深入理解JavaScript系列(30):设计模式之外观模式详解
Mar 03 #Javascript
You might like
PHP更新购物车数量(表单部分/PHP处理部分)
2013/05/03 PHP
PHP处理CSV表格文件的常用操作方法总结
2016/07/01 PHP
详解PHP使用Redis存储session时的一个Warning定位
2017/07/05 PHP
怎么让脚本或里面的函数在所有图片都载入完毕的时候执行
2006/10/17 Javascript
javascript编程起步(第二课)
2007/02/27 Javascript
jQuery源码分析之Event事件分析
2010/06/07 Javascript
Javascript脚本实现静态网页加密实例代码
2013/11/05 Javascript
js判断当前浏览器类型,判断IE浏览器方法
2014/06/02 Javascript
node.js学习总结之调式代码的方法
2014/06/25 Javascript
JavaScript基础知识学习笔记
2014/12/02 Javascript
使用javascript实现简单的选项卡切换
2015/01/09 Javascript
浅谈JavaScript 数据属性和访问器属性
2016/09/01 Javascript
JavaScript实现图片懒加载(Lazyload)
2016/11/28 Javascript
JavaScript实现多叉树的递归遍历和非递归遍历算法操作示例
2018/02/08 Javascript
JS获取并处理php数组的方法实例分析
2018/09/04 Javascript
[02:29]DOTA2英雄基础教程 陈
2013/12/17 DOTA
Python实现Linux下守护进程的编写方法
2014/08/22 Python
Python排序算法实例代码
2017/08/10 Python
python matplotlib 注释文本箭头简单代码示例
2018/01/08 Python
numpy matrix和array的乘和加实例
2018/06/28 Python
python进阶之多线程对同一个全局变量的处理方法
2018/11/09 Python
聊聊python里如何用Borg pattern实现的单例模式
2019/06/06 Python
python实现鸢尾花三种聚类算法(K-means,AGNES,DBScan)
2019/06/27 Python
Python内存映射文件读写方式
2020/04/24 Python
基于python实现可视化生成二维码工具
2020/07/08 Python
Python pip install之SSL异常处理操作
2020/09/03 Python
python math模块的基本使用教程
2021/01/16 Python
前端水印的简单实现代码示例
2020/12/02 HTML / CSS
美国传奇滑手Paul Rodriguez创办的街头滑板品牌:Primitive Skateboarding
2019/10/29 全球购物
临床医学专业毕业生的自我评价
2013/10/17 职场文书
客服主管岗位职责
2013/12/13 职场文书
学校端午节活动总结
2015/02/11 职场文书
小学教师个人工作总结2015
2015/04/20 职场文书
react中的DOM操作实现
2021/06/30 Javascript
Android自定义ScrollView实现阻尼回弹
2022/04/01 Java/Android
Go归并排序算法的实现方法
2022/04/06 Golang