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

Давайте создадим примесь "страхуемый", которую мы могли бы применить к ав­
       томобилям. Мы не будем усложнять пример, но в дополнение к примеси страхова­
                                                l
       ния необходимо создать класс  InsurancePo i cy. Примесь страхования нуждается
                               o
       в методах addinsuranceP l i cy, getinsurancePolicy и  (для удобства)  i s insured.
       Давайте рассмотрим, как это могло бы работать.
       class  InsurancePolicy ( )    { }
       function  makeinsuraЬle ( o )   {
                                                i
           o . addinsurancePolicy  =  function ( p )    {  th s . insurancePolicy  =  р ;   }
                                                      i
           o . get insurancePolicy  =  function ( )    {  return  th s . insurancePolicy;
                                (
             i
           о.  s insured  =  function  )    {  return  !  ! th s .   insurancePolicy;  }
                                               i
          Теперь мы можем сделать любой объект подлежащим страхованию. Так  как мы
       собираемся сделать подлежащим страхованию класс Car? Ваша первая мысль могла
       бы быть такой.
       makeinsuraЬle ( C ar) ;
          Но вы были бы неприятно удивлены.
       const  carl   =  new  Ca ( ) ;
                         r
       carl . addinsurancePo i cy ( n ew  InsurancePolicy ( ) ) ;    / /  ошибка
                         l
          Если вы подумали "Конечно, ведь addinsurancePolicy не находится в цепи про­
       тотипов': то будете совершенно правы. Делать класс Car подлежащим страхованию
       вообще плохая идея. Кроме того, это вообще не имеет смысла: абстрактная концеп­
       ция автомобиля не подлежит страхованию, но конкретный автомобиль - подлежит.
       Таким образом, наше следующее решение могло бы быть таким.

       const  carl   =  new  Ca ( ) ;
                         r
       makeinsuraЬle ( c arl ) ;
                                               y
       carl . addinsurancePolicy (new  InsurancePolic ( )   )  ;    / /  работает
          Это  работает,  но теперь нужно  не забыть  вызывать функцию makei n s u raЫe
       для  каждого  создаваемого нами автомобиля.  Мы могли бы добавить этот  вызов
       в конструктор Car, но тогда мы продублируем эту функцию для каждого созданного
       автомобиля. К счастью, решение простое.
       makeinsuraЬle ( C ar . prototype )  ;
                         r
       const  carl  =  new  Ca ( ) ;
       carl . addinsurancePolicy ( n ew  InsurancePolicy ( ) )  ;    / /  работает
          Т е перь это выглядит так, как будто наши методы всегда были частью класса Car. И
       с точки зрения JavaScript так и есть. С точки зрения разработчика мы облегчили под­
       держку этих двух важных классов. Г р уппа разработчиков автомобилей создает и обслу­
       живает класс Car, а группа страхования занимается классом InsurancePolicy и приме­
       сью makeinsuraЫe. В результате место для пересечения двух групп все таки имеется, но
       это куда лучше, чем когда все работают над одним гигантским классом Car.


                                    Множественное наследование, примеси и интерфейсы   1 8 9
   183   184   185   186   187   188   189   190   191   192   193