Page 206 - Браун Э. - Изучаем JavaScript. Руководство по созданию современных веб-сайтов - 2017
P. 206
i
th s . m essages . push ( { me s age : message, timestam : Date . n o ( ) ) ) ;
w
s
p
[ S y mЬol . iterator ] ( ) {
e
return this . m essag s . values ( ) ;
Теперь мы можем перебрать содержимое экземпляра класса Log точно так же, как
если бы это был массив.
g
const log = new Lo ( ) ;
е
d
g
lо . а d ( " П ервый день на мор " ) ;
d
lоg . а d ( " Видели большую рыб " ) ;
у
(
log . add " Видели корабль " ) ;
1 1 . . .
// перебор log, как будто это массив !
for ( l et entry of log) {
y
console . l og ( ' $ { entry . m essage ) @ $ { e ntr . timestam ) ' ) ;
p
В этом примере мы соблюдаем протокол итератора, получив итератор массива
s
me s a ges, но мы вполне могли бы написать и собственный итератор.
class Log
/ / . . .
[SymЬol . i terator] ( )
let i = О ;
e
const messages this . m e s sag s ;
return {
next ( ) {
i f ( i >= messages . length)
return { value : undefined, done : true } ;
e
return { value : messag s [i++] , done : false ) ;
В рассмотренных здесь примерах задействован перебор предопределенного набора
элементов: страниц в книге или сообщений в журнале. Но итераторы можно использо
вать и для представления объекта, значения которого никогда не исчерпаются.
Для демонстрации рассмотрим очень простой пример: создание чисел Фибонач
чи. Числа Фибоначчи не особенно трудно создавать, но они зависят от предыдущих
чисел. Для непосвященного: последовательность Фибоначчи - это сумма предыду
щих двух чисел в последовательности. Последовательность начинается с 1 и 1 : сле
дующее число 1 + 1 равно 2. Следующее число 1 + 2 равно 3. Четвертое число 2 + 3
равно 5 и т.д. Последовательность выглядит следующим образом.
1 , 1 , 2 , 3 , 5 , 8 , 1 3 , 2 1 , 3 4 , 5 5 , 8 9 , 1 4 4 , . . .
208 Гnава 1 2 . Итераторы и ге н ераторы

