Page 183 - Браун Э. - Изучаем JavaScript. Руководство по созданию современных веб-сайтов - 2017
P. 183
class Car {
static getNextVin ( )
return Car . nextVin++; // мы могли бы также использовать
// this . nextVin++, но обращение к Car
/ / подчеркивает, что это статический метод
l
constructor (make , mode )
this . m ake = make ;
th s . m odel = mod l ;
e
i
this . vin = Car . getNextVin ( ) ;
static areSimilar ( c arl , ca 2 ) {
r
return carl . m ake===car2 . m ake && carl . m odel===car2 . m od l ;
e
(
static areSame c arl , car2 ) {
return carl . vin===car2 . v in;
Car . nextVin = О ;
a
const carl new Car ( " Tesl " , " S " ) ;
const car2 new Car ( "Mazda" , " 3 " ) ;
const car3 new Car ( "Mazda" , " 3 " ) ;
r
ca l . vin; / / О
car2 . v in; / / 1
car3 . v in // 2
Car . areSimilar ( c a r l , car2 ) ; 1 1 fa lse
Car . areSimilar ( c ar2 , car3 ) ; 1 1 true
Car . areSame ( c ar2 , car3 ) ; 1 1 false
Car . areSame ( c ar2 , car2 ) ; 1 1 true
Наследо в а н и е
Рассматривая прототипы, мы уже встречали некий вид наследования: при созда
нии экземпляра класса он наследовал все функции, находящиеся в прототипе класса.
Но на этом дело не заканчивается: если метод не найден в прототипе объекта, прове
ряется прототип прототипа. Так получается цепь прототипов. JavaScript будет идти
по цепи прототипов, пока не найдет тот прототип, который удовлетворяет запросу.
Если такой прототип не будет найден, то все закончится ошибкой.
Это пригодится при создании иерархии классов. Мы уже упоминали, что авто
мобиль - это общий тип транспортного средства. Цепь прототипов позволяет рас
полагать функции там, где им самое место. Например, у автомобиля мог бы быть
метод deployAirbags. Мы могли бы сделать его методом обобщенного транспорт
ного средства, но вы когда-либо видели лодку с подушками безопасности? С другой
стороны, почти все транспортные средства могут перевозить пассажиров; таким об
s
разом, у транспортного средства мог бы быть метод addPa s e nger (который мог бы
184 Глава 9. Объекты и объектно-ориентирован н ое программирование

