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

•  Атрибут enumeraЫe (перечислимый) определяет, будет ли свойство участво­
             вать в  перечислении свойств объекта (с использованием  for  . .   in,  Obj ect .
                                                                      .
             keys или оператора расширения).
          •  Атрибут  configuraЫe  (перестраиваемый)  определяет,  может ли свойство
             быть удалено из объекта или могут ли быть изменены его атрибуты.

          Мы  можем  управлять  атрибутами свойства,  используя  метод  Obj ect . def i n e
             r
       P r ope t y .  Он  позволяет создавать новые  свойства  или  изменять  существующие
       (если это свойство перестраиваемое).
          Например, чтобы сделать свойство  foo объекта obj  доступным только для чте­
       ния, можно использовать Ob e ct . defineProperty так.
                                 j
       Obj ect . defineProperty { o bj ,  ' f o ' ,   {  writaЫe :  false  } ) ;
                                    o
          Т е перь, если мы попытаемся присвоить значение свойству foo, то получим ошибку.
       obj . f oo  =  З ;
       1 1
       TypeError :  Нельзя  присваивать  значение  свойству  'foo ' ,   доступному  только  чтение

                  Попытка изменить значение свойства только для чтения закончится
                  ошибкой только в строгом режиме. В нестрогом режиме ничего при­
                  своено не будет, но и ошибки при этом тоже не будет.


                                                       f
          Мы можем также использовать метод Obj ect . de i neProperty для добавления
       к объекту нового свойства. Это особенно полезно для свойств с атрибутами, поскольку
       в отличие от свойств данных нет никакого другого способа добавить свойство доступа
       после того, как объект был создан. Давайте добавим к объекту obj  свойство color (на
       сей раз мы не будем заботиться о символах или проверке правильности).
       Obj ect . defineProperty { o bj ,  ' c olo ' ,    {
                                      r
           ge :   function { )    {  return  this . color ;  } ,
             t
           set :  function { v alue )  {  thi s . color  =  value ;  } ,
       } )   ;
          Чтобы создать свойство данных, нужно указать его значение в параметрах при
       вызове Object . defineProperty. Добавим к объекту obj свойства name и greet.

                                     e
                            {
       Obj ect . defineProperty  o bj ,  ' n am ' ,    {
           value :  ' C ynthia ' ,
       } )   ;
                            {
       Obj ect . defineProperty  o bj ,  ' g reet ' ,   {
           value :  function ( )    {  return  ' П риве ,   меня  зовут  $  { this . n am } !  ' ;   }
                                           т
                                                                  e
       } )   ;
          Один  из популярных случаев применения  Obj ect . def i neProperty  - это сде­
       лать  свойства неперечислимыми  в  массиве.  Мы упоминали прежде,  что  не стоит

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