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

Единственное, что в этом примере заставляет нас использовать два метода (вме­
       сто  обычного  свойства  данных),  - это  предотвращение  присваивания  свойству
       USER _ EMAIL недопустимого адреса электронной почты. Здесь мы используем сим­
       вольное свойство, чтобы блокировать случайный прямой доступ к свойству данных,
       содержащему адрес электронной  почты.  Если бы  мы назвали  строковое  свойство
         a
                          a
       em i l   или даже _ em i l , то было бы довольно просто по небрежности обратиться
       к нему непосредственно.
          Это типичный сценарий  использования, и он прекрасно работает, но несколько
       громоздким, чем нам хотелось бы. Вот пример использования этого класса.

       const  u  =  new  User ( ) ;
       u  . setEma l ( " j o hn@doe . com" )  ;
               i
                 g
       console . l o ( ' Aдpec  пользователя :  $ { u  . getEmail ( ) }  ' ) ;
          Хотя это вполне сработает, было бы естественнее написать
       const  u  =  new  User ( ) ;
            i
       u  . e ma l   =  " j ohn@doe . c om" ;
       console . l o ( ' Aдpec  пользователя :  $ { u  . e mai } ' ) ;
                                              l
                 g
          Введем свойства доступа: они позволят сохранить преимущества прежнего под­
       хода с естественным синтаксисом последнего. Давайте перепишем наш  класс,  ис­
       пользуя свойства доступа.
       const  USER_EМAIL  =  SymЬol ( ) ;
       class  User  {
           s e t  email ( v alue )  {
                               e
                                                                            e
               i f ( ! / @ / . t est ( v alu ) )  throw  new  Еrrоr ( ' Неправильный  адре :   $ { v alu } ' ) ;
                                                                    с
                            L
               this [USER_EМAI ]    =  value ;
           get  email  )    {
                    (
               return  this [ U SER_EМAIL] ;

                                                                                a
          Мы создали две  разные функции,  но  они  связаны с единым свойством em i l .
       Если значение свойству присваивается, то вызывается функция установки значения
       (с передачей присваиваемого значения в качестве первого аргумента), а если значе­
       ние свойства запрашивается, то вызывается функция получения значения.
          Можно создать функцию-получатель без функции-установщика значения; рас­
       смотрим, например, функцию-получатель,  которая возвращает периметр прямоу­
       гольника.
       class  Rectangle
           constructor (width,  height )
               th s . width  =  width ;
                 i
               th s . height  =  height ;
                 i

       340     Глава 2 1 . Свойства объекта и п р окси-объекты
   332   333   334   335   336   337   338   339   340   341   342