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

t
       be t erCoefficients  . d;   //  О
       betterCoefficients  . anything ;  //  О;
          По существу, мы создали прокси-объект для нашего объекта coefficients, кото­
       рый способен иметь бесконечное количество свойств (все устанавливаются равными
       О, кроме тех, которые были определены явно)!
          Мы могли бы еще несколько улучшить свой прокси-объект, чтобы он обрабаты­
       вал только свойства, имена которых состоят из одиночных строчных букв.
       const  betterCoefficients  =  new  Proxy ( c oefficients ,    {
                        y
                   e
           get ( targ t ,   ke )    {
               if ( ! / л [ a -z ] $ / . t est ( k ey) )  return  target [ k ey] ;
               return  target  k ey]  1  1     О ;
                            [
           } ,
       } ) ;
          Вместо простой проверки  а   существование свойства target  k ey] м ы   могли бы
                                                                  [
                                  н
       возвращать О, если его значение не является числом .. Я оставляю это упражнение
                                                       .
       для читателя.
          Т о чно так же мы можем перехватить свойства (или методы доступа), устанавливае­
       мые обработчиком set. Давайте рассмотрим пример, в котором у объекта имеются опас­
       ные свойства. Мы хотим воспрепятствовать установке значений этих свойств и вызову
       методов-установщиков без дополнительного этапа контроля. Дополнительным этапом
       контроля, который мы будем использовать перед обращением к опасным функциям, яв­
       ляется установка свойства allowDangerousOperations равным значению t r ue.
       const  cook  =  {
           name :  "Wa t " ,
                    l
           redPhosphorus :  1 0 0 ,   //  опасно
           water :  5 0 0 ,    //  безопасно
       } ;
       const  protectedCook   new  Proxy ( c ook,
           set ( t arget ,   key,  value )  {
               if ( k e y    ===  ' r edPhosphorus ' )    {
                   i f ( t arget . a llowDangerousOperations )
                       return  targe . redPhosphorus  =  value ;
                                  t
                   else
                                                    о
                       return  console . l og ( "Oчeнь  опасн ! " ) ;
               }
               / /  в с е  остальные  свойства  безопасны
               target [ k ey]  =  value ;
           } ,
       } )   ;

                  o
       protectedCo k . w ater  =  5 5 0 ;    11  550
                                                   а
       protectedCoo . redPhosphorus   1 5 0 ;   //  Очень  оп с но !
                   k

       348      Глава 21 . Свойства объекта и прокси-объекты
   340   341   342   343   344   345   346   347   348   349   350