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 . Итераторы  и  ге н ераторы
   201   202   203   204   205   206   207   208   209   210   211