Page 205 - Браун Э. - Изучаем JavaScript. Руководство по созданию современных веб-сайтов - 2017
P. 205
k
const itl = boo . values ( ) ;
const it2 = book . values ( ) ;
1 1 оба итератора в начальном положении
1 1 чтение двух страниц с i t l :
i t l . n ext ( ) ; / / { value: "Twinkle, twinkle, little ba t ! " , do e : false }
n
n
i t l . n ext ( ) ; / / { value: "How I wonder wh t you 're a t ! ", do e : fa lse }
a
1 1 чтение одной страницы с it2:
it2 . next ( ) ; / / { value: " T winkle, twinkle, little ba t ! " , do e : false }
n
1 1 чтение д р угой страницы с i t l :
n
itl . n ext ( ) ; / / { value: "Ир above the world you fly, ", do e : false }
В данном примере эти два итератора независимы и перебирают массив по соб
ственному индивидуальному расписанию.
Протокол ите р атора
Итераторы сами по себе мало интересны: они - лишь инструмент, обеспечива
ющий более интересные действия. П р отокол итератора (iterator protocol) позволя
ет стать итерируемым любому объекту. Предположим, что вы хотите создать класс
системноrо журнала, в котором сообщениям будут добавляться временные метки.
Внутренне для хранения сообщений с временными метками мы используем массив.
class Log {
constructor ( ) {
.
this m essages [ ] ;
add (message ) {
this . m essages . p ush ( { message : me s age , t i mestamp : Date . n o ( ) } ) ;
s
w
Пока неплохо". Но что если мы захотим впоследствии перебрать все элементы
в журнале (т.е. выполнить их итерацию)? Конечно, мы могли бы обращаться напря
мую к массиву log . m e s s a ges, но было бы куда лучше, если бы мы могли обработать
log так, как будто он непосредственно итерируем, подобно массиву? Протокол итера
тора позволяет нам сделать это. Он гласит, что если ваш класс предоставляет символь
ный метод SymЬol . iterator, который возвращает объект с поведением итератора (т.е.
у него есть метод next, возвращающий объект со свойствами value и done), то он ите
рируем! Давайте изменим наш класс Log так, чтобы он имел метод SymЬol . i terator.
class Log {
constructor ( ) {
this m essages [ ] ;
.
add (message ) {
Протокол итератора 207

