【学习笔记javascript设计模式与开发实践(迭代器模式)----7】
来源:互联网 发布:如何复制淘宝店铺链接 编辑:程序博客网 时间:2024/06/01 07:30
第7章 迭代器模式
迭代器模式是指提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。迭代器模式可以把迭代的过程从业务逻辑分离出来,在使用迭代器模式之后,即使不关心对象的内部构造,也可以按顺序访问其中的每个元素。
7.1 jQuery中的迭代器
迭代器模式无非就是循环访问聚合对象中的各个元素。比如jQuery中的$.each函数,其中回调函数中的参数i为当前索引,n为当前元素,如下:
7.2 实现自己的迭代器
现在我们可以自己来实现一个each函数,each函数接受2个参数,第一个为被循环的数组,第二个为循环中的每一步后将被触发的回调函数
7.3 内部迭代器和外部迭代器
迭代器可以分为内部迭代和外部迭代器,它们有各自的适用场景。这一节我们将分别讨论这两种迭代器。
1. 内部迭代器
我们刚刚编写的each函数属于内部迭代器,each函数的内部已经定义好了迭代规则,它完全接手整个迭代过程,外部只需要一次初始调用。
内部迭代器在调用的时候非常方便,外界不用关心迭代器的内部实现,跟迭代器的交互也仅仅是一次初始调用,但这也刚好蚋部迭代器的缺点,由于内部迭代器的迭代规则已被提前规定,上面的each函数就无法同时迭代2个数组
比如现在有个需求,要判断2个数组里元素的值是否完全相等,如果不改写each函数本身的代码,我们能够入手的地方似乎只剩下each回调函数,如下:
说实话,这个compare函数一点都算不上好看,我们目前能够顺利完成需求,还要感谢javascript里可以把函数当作参数传递的特性。但在其他语言中未必就能如此幸运。在一些没有闭包的语言中,内部迭代器本身的实现也相当复杂,如C语言中的内部迭代器是用函数指针来实现的,循环处理所需要的数据都要以参数的形式明确地从外面传递进去。
2. 外部迭代器
外部迭代器必须显式地请求迭代下一个元素。
外部迭代器增加了一些调用的复杂度,但相对也增强了迭代器的灵活性,我们可以手工控制迭代的过程或者顺序。
下面这个外部迭代器的实现来自《松本行弘的程序世界》用Ruby写成,这里我们翻译成js:
再看看如何改写compare函数:
外部迭代器虽然调用方式相对复杂,但它的适用更广,也能满足更多变的需求。内部迭代器和外部迭代器在实际生产中没有优劣之分,究竟使用哪个要根据需求场景而定。
7.4 迭代类数组对象和字面量对象
迭代器模式不仅可以迭代数组,还可以迭代一些类数组对象。比如arguments、{“0”,”a”,”1”:”b”}等。能过上面的代码可以观察到,无论是内部迭代器还是外部迭代器,只要迭代的聚合对象拥有length属性而且可能用下标访问,那它就可以被迭代。
在JavaScript中,for in 语句可以用来迭代普通字面量对象。jQuery中提供了$.each函数来封装各种迭代行为:
7.5 倒序迭代器
由于GoF中对迭代器的模式的定义非常松散,所以我们可以有多种多样的迭代器实现。总的来说,迭代器模式提供了循环访问一个聚合对象中每个元素的方法,但它没有规定我们以顺序、倒序还是中序来循环遍历聚合对象
倒序遍历对象:
7.6 中止迭代器
迭代器可以像普通for循环中的break一样,提供一种跳出循环的方法。在上一节中的each函数里有这样一句:
这句代码的意思是,约定如果回调函数的执行结果返回false,则提前终止循环。下面我们把之前的each函数改写一下:
7.7 迭代器模式的应用举例
作者曾经要重构一个模块的代码,发现下面的这段代码,它的目的是根据不同的浏览器获取相应的上传组件对象:
现在来梳理一下问题,目前一共有3种可能上传的方式,我们不知道目前正在使用的浏览器支持哪几种。就好比我们有一个钥匙串,其中共有3把钥匙,我们想打开一扇门但是不知道用哪把钥匙,于是从第一把开始,迭代钥匙串进行尝试,直到找到正确的钥匙为止。
同样,我们把每种获取upload对象的方法都封装在各自的函数里,然后使用一个迭代器迭代获取这些upload对象,直到获取到一个可用的为止:
在上述的3个函数中我们都有同一个约定,如果该函数里面的upload对象是可用的,则让函数返回该对象,反之返回false,提示迭代器继续往后进行迭代
如后期还要支持HTML5的或是webkit的只要添加相应的函数就OK
- 【学习笔记javascript设计模式与开发实践(迭代器模式)----7】
- 【学习笔记javascript设计模式与开发实践(迭代器模式)----7】
- 【学习笔记javascript设计模式与开发实践----1】
- javascript设计模式与开发实践--学习笔记一
- 【学习笔记javascript设计模式与开发实践----1】
- JavaScript设计模式与开发实践笔记
- 【学习笔记javascript设计模式与开发实践(单例模式)----4】
- 【学习笔记javascript设计模式与开发实践(策略模式)----5】
- 【学习笔记javascript设计模式与开发实践(代理模式)----6】
- 【学习笔记javascript设计模式与开发实践(发布--订阅模式)----8】
- 【学习笔记javascript设计模式与开发实践(命令模式)----9】
- 【学习笔记javascript设计模式与开发实践(组合模式)----10】
- 【学习笔记javascript设计模式与开发实践(模板方法模式)----11】
- 【学习笔记javascript设计模式与开发实践(享元模式)----12】
- 【学习笔记javascript设计模式与开发实践(职责链模式)----13】
- 【学习笔记javascript设计模式与开发实践(中介者模式)----14】
- 【学习笔记javascript设计模式与开发实践(装饰者模式)----15】
- 【学习笔记javascript设计模式与开发实践(状态模式)----16】
- 一个循环队列在linux下的应用
- TortoiseSVN 修改服务器地址url
- ubuntu 左边菜单栏不见
- Codeforces Intel Code Challenge Elimination Round(Oct/01/2016)
- tortoise working copy locked 问题
- 【学习笔记javascript设计模式与开发实践(迭代器模式)----7】
- PHP notice/warning 对性能的影响
- windows server 2003 搭建环境
- 记一次jpgrap汉化过程
- 限定域用户登录指定计算机
- 电商抢购秒杀系统的设计及应用场景分析
- 杀死阻塞线程
- MySQL学习第一天--简单的操作
- windows 当前文件夹内的文件名