Page 340 - Браун Э. - Изучаем JavaScript. Руководство по созданию современных веб-сайтов - 2017
P. 340

использовать строковое или символьное свойство в массиве, поскольку это противо­
       речит самой идее применения массива, но это может быть полезно, если сделано осто­
                                                    .
       рожно и осмысленно. Хотя применение цикла for  . .   in или Object . keys для массива
                                                                          .
       также не очень хорошо (вместо них рекомендуется использовать for, for  . .   of или
          a
       Arr y .   prototype . forEach), вы не можете запретить людям ими пользоваться. Поэто­
       му, добавляя нечисловые свойства к массиву, необходимо делать их неперечислимыми
                                                                          .
       на случай, если кто-то  (по неосторожности) воспользуется массивом  for  . .   in или
       Obj ect . keys. Вот пример добавления к массиву методов sum и avg.
       const  arr  =  [ 3 ,   1 . 5 ,  9 ,   2 ,   5  . 2 ] ;
                                      i
       arr . sum  =  function ( )    {  return  th s . reduce ( ( a ,   х )   =>  а+ ) ;
                                                           х
                                          m
       arr . avg  =  function ( )    {  return  this . s u ( ) /this . length;
                                                  e
       Obj ect . defineProperty  a rr,  ' s u ' ,  {  enumeraЫ :   false  } ) ;
                            (
                                    m
                            (
                                    g
       Obj ect . defineProperty  a rr,  ' a v ' ,  {  enumeraЬle :  false  } ) ;
          Мы моrли бы также сделать это за один этап для каждого свойства.
       const  arr  =  [ 3 ,   1  . 5 ,    9,  2 ,   5  . 2 ] ;
       Obj ect . definePropert ( arr,  ' s u ' ,  {
                                    m
                          y
           value :  function ( )    {  return  this . reduce ( ( а ,   х )   =>  а+ ) ;  ) ,
                                                            х
                    e
           enumeraЫ :   false
       } )   ;
                          y
       Ob e ct . definePropert ( arr,  ' a v ' ,  {
         j
                                    g
                                                         h
                                           m
           value :  function ( )    {  return  this ; s u ( ) /this . lengt ;   } ,
           enumeraЫe :  false
       } )   ;
          Наконец есть также метод Obj ect . defineProperties (обратите внимание на на­
       звание во множественном числе!), который позволяет определить сразу несколько
       свойств для объекта. Таким образом, мы можем переписать предыдущий пример как
       const  arr =  [ 3 ,   1  . 5 ,  9 ,   2 ,   5  . 2 ] ;
       Obj ect . defineProperties ( a rr,
           sum :  {
               value :  function ( )    {  return  this . reduce (  ( а ,   х )   =>  а+х ) ;  } ,
                       e
               enumeraЫ :   false
           } )   ,
           avg :  {
                                               m
                                                     i
               value :  function ( )    {  return  this . s u ( ) /th s . length;  } ,
               enumeraЫe :  false
           } )
       ) ;
       Защита объектов: заморажив               а н и е  ,
       запечатыв а н и е   и запрет расш        и р е н и я
          Гибкая природа языка JavaScript позволяет создавать очень мощный код, однако
       одновременно она является и причиной всех проблем. Поскольку любой код в любом


                        Защита объектов: замораживание, запечатывание и запрет расширения   343
   335   336   337   338   339   340   341   342   343   344   345