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

get  userGear ( )    {  return  this .  userGe r ;
                                             a
           s e t   userGear ( v alue )  {
               if ( t his . _userGears . i ndexOf ( v alue )  <  0 )
                  throw  new  Еrrоr ( ' Ошибочная  передача :  $ { value ) ' ) ;
               this .  userGear  =  value ;


                          i
           shift ( g ear)  {  th s . userGear  =  gear; )
          Проницательный читатель заметил, что  мы не устранили проблему,  поскольку
       значение _ userGear все еще можно установить непосредственно: carl . _ userGear  =
       ' Х  ' .   В этом примере мы используем "ограничение доступа для  бедных" - свойства,
       имена которых начинаются с символа подчеркивания, мы считаем закрытыми. Эта
       защита сугубо в соглашении, позволяющем быстро просмотреть код и выявить свой­
       ства, к которыми вы не должны обращаться непосредственно.
          Если вы действительно должны обеспечить конфиденциальность, то можете ис­
       пользовать экземпляр WeakMap (см. главу  1 0 ), который защищен областью видимо­
       сти (если мы не будем использовать WeakMap, то наши закрытые свойства никогда
       не будут выходить из области видимости, даже если экземпляры, к которым они от­
       носятся, выйдут). Чтобы сделать основное текущее свойство передачи действительно
       закрытым, мы можем изменить свой класс Car так.
       const  Car  =  ( f unction ( )    {
           const  carProps  =  new  WeakMap ( ) ;

           class  Car  {
                                   e
                             e
               constructor (mak ,   mod l )
                   th s . m ake  =  make ;
                    i
                   this . m odel   =  mode ;
                                   l
                   thi s . _ userGears  =  [ ' Р  ' ,    ' N  ' ,  ' R  ' ,  ' D  ' ] ;
                                            a
                              (
                   carProps . set  t h i s ,    {  userGe r :   this . _ userGears  О ]   ) )  ;
                                                               [
               get  userGear ( )    {  return  carProps . g et ( t h i s )   . u serGear ;
                           (
               set  userGear  v alue )  {
                                            (
                   if ( t his . _userGears . indexOf  v alue )  <  0 )
                      throw  new  Еrrоr ( ' Ошибочная  передача :  $ { value ) ' ) ;
                   carProps . g et ( t h i s )   . u serGear  =  value ;
                              i
               shift ( g ear)  {  th s . userGear   gear;  )

           return  Car;
       } )   ( ) ;


       1 8 0   Глава  9. Объекты и объектно-ориентированное программирование
   174   175   176   177   178   179   180   181   182   183   184