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
   200   201   202   203   204   205   206   207   208   209   210