Javascript Patterns--读书笔记9 (Iterator)
如果你有一个对象,它包含一组有序的聚簇数据(其实就是一个或者一组利用某种结构聚集起来的数据),你如果想要一种统一的并且是简单的访问接口来访问这一组数据,那么iterator就可以发挥它的用武之地了。调用这个对象的code不需要了解你对象的数据结构,它们唯一需要知道的是如何来得到其中的每一个元素。
在Iterator模式中,你的object需要提供一个next()方法,当调用next()的时候,它必须返回你这个对象中的下一个element, 当然这取决于你的数据结构,来确定下一个element到底是哪一个元素,有可能是物理不挨着,或者是出于某种目的,你给他们人为的排序。
当然我们还得需要提供另一个函数,hasNext()用来告诉你是否已经取到最后一个元素了。
让我们先来看一下两段测试用例,就是我们如何用next()和hasNext():
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
var element; while (elemnet = agg.next()) { //do something with the element .... console.log(element); }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
while(agg.hasNext()) { //do something with the next element... console.log(agg.next()); }
我们在还没有编码的情况下,而先把测试用例准备好的开发方法被称之为TDD
让我们来实现具体的编码,先设计一下,当我们在实现iterator模式的时候,我们用到的数据不需要对外公开,而只需要接口对外公开,所以我们把它定义成private是很合适的,同理还有index(即是用来指示当前数据的指针)。为了演示和简单的目的, 我们选用普通的array.
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
//采用利即执行函数来得到一个对象,这是闭包的一个应用 var agg = (function(){ var index = 0, data = [1, 2, 3, 4, 5], length = data.length; //返回的实际上是这个literal object return { next: function() { var element; if(!this.hasNext()) { return null; } element = data[index]; index = index + 1; return element; }, hasNext: function() { return index < length; } }; }());
上面那些只是必须有的方法,有时我们为了方便,会多加些方法:
rewind(): 把指针移到第一个元素上
currennt():返回当前的指针所指向的元素
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
//采用利即执行函数来得到一个对象,这是闭包的一个应用 var agg = (function(){ var index = 0, data = [1, 2, 3, 4, 5], length = data.length; //返回的实际上是这个literal object return { next: function() { var element; if(!this.hasNext()) { return null; } element = data[index]; index = index + 1; return element; }, hasNext: function() { return index < length; }, rewind: function() { index = 0; }, current: function() { return data[index]; } }; }());