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

1 1   определенный  ранее  класс  Car  с  методом  shift
       const  carl   =  new  Ca ( ) ;
                         r
       const  car2   =  new  Ca ( ) ;
                         r
       carl . shift  ===  Car . prototype . s hift ;  / /   true
       carl . shift (  D '  ' ) ;
                  '
       carl . shift (  d ' ) ;            1 1   ошибка
       carl . userGear ;                  / /    'D '
       carl . s hift  ===  car2 . s hift   1 1   true
       carl . s hift  =  function ( g ear)   this . userGear   gear . t oUpperCase ( ) ;  }
                        r
       carl . shift  ===  Ca . prototype . s hift ;  / /   false
       carl . s hift  ===  car2 . s hift ;   / /   false
       carl . shift ( ' d ' ) ;
       carl . userGear ;                  / /    'D '

          В этом примере ясно показано, как JavaScript осуществляет динамический вызов.
                                                                               '
                                                                      r
       Первоначально у объекта carl нет метода shift, но при вызове ca l . shift (  D ' )
       JavaScript просматривает прототип для carl и находит метод с таким именем. Когда
       мы заменяем метод shift собственной версией, то у объекта carl и у его прототипа
                                                                   '
       появляется метод с этим именем. Однако при вызове carl . shift (  d ' ) , будет вызван
       метод объекта carl, а не его прототипа.
          Обычно в знании механики цепи прототипов и динамического вызова у вас не
       будет особой нужды, но все же может встретиться проблема, которая потребует их
       глубокого понимания. Поэтому, прежде чем продолжать, имеет смысл узнать детали.


       Статические методы
          Методы, которые мы рассматривали до сих пор, являлись методами экземпляра
       (instance method). Они предназначены для работы с конкретным экземпляром. Есть
       также статические методы (static method) (или методы класса (class method)), кото­
       рые не относятся ни к какому конкретному экземпляру. В статическом методе пере­
       менная this привязана к самому классу, но в этом случае вместо нее рекомендуется
       использовать имя класса.
          Статические методы используются для выполнения обобщенных задач, которые
       связаны с классом, а не с  любым конкретным экземпляром. Давайте рассмотрим
       пример использования VIN автомобиля (идентификатор транспортного средства).
       Нет смысла позволять индивидуальному автомобилю создавать собственный VIN:
       что помешало бы автомобилю использовать такой же VIN, как и у другого автомо­
       биля?  Однако  присвоение VIN является абстрактной концепцией, которая связа­
       на с идеей автомобиля вообще; следовательно, это кандидат в статические методы.
       Кроме того, статические методы зачастую используются для работы с несколькими
       транспортными средствами (объектами). Например, нам может понадобиться метод
                                      t
       areSirnilar, который возвращает  r ue, если у двух автомобилей те же марка и мо­
       дель, а метод areSarne, возвращающий  r ue, если у двух автомобилей один и тот же
                                          t
       VIN. Давайте рассмотрим эти статические методы, реализованные для класса Car.

                                         Объектно-ориентированное программирование   1 8 3
   177   178   179   180   181   182   183   184   185   186   187