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

