Прототипное программирование и прототипное наследование: что это?

Прототипное программирование и прототипное наследование часто применяют в JavaScript, как альтернативу классическому объектно-ориентированному программированию, реализованному в С или Java. В классическом ООП сначала создается класс, как некий образец для дальнейшей работы с ним, потом на основе данного класса-образца создается объект. Когда нужно создать более унифицированный тип объекта, тогда создается потомок класса-образца, то есть в сам образец вносятся какие-то изменения, а потом этот измененный образец-прототип применяется для выстраивания необходимых нам объектов.

Если перенести ООП в реальную жизнь людей, то перед тем, как создать обеденный стол, сначала его чертят на ватмане, а потом на основе этого чертежа уже изготавливают сам обеденный стол. Чертеж на бумаге — это класс, а обеденный стол это ни что иное, как сам  объект. Если вдруг вздумается реализовать компьютерный стол, тогда есть возможность внести соответствующие корректировки в чертеж обеденного стола и потом, взяв за основу новый чертеж, мы можем создать компьютерный стол.

 

Прототипное программирование и прототипное наследование в Джава Скрипт

Давайте мысленно и плавно перенесемся в прототипное программирование в Java Script. Мы увидим, что тут вообще не создаются классы или «чертежи», здесь сразу создается объект. То есть вы покупаете материал, берете в руки молоток, пилу и гвозди и создаете себе обеденный стол. У вас получится стол, который будет полноценным столом, но при этом он будет служить еще и основой для создания новых столов. По сути, если вы захотите сделать компьютерный стол, то вы клонируете уже сделанный обеденный стол, потому к нему добавляете полочки и подставку под «системник», и у вас получается полноценный компьютерный стол.

 

Прототипное программирование и наследие в JavaScript на примере

Прототипное программирование в JavaScript можно легко разобрать и понять на следующем примере. Для начала проектируем некий объект «Cars»:

var genericCars = Object.create(null);

 

Далее к нашему пустому объекту «Object.create(null)» добавляем некоторый набор свойств и функций:

genericCars.name =  "Жигули" ;

genericCars.color =  "Синий" ;

genericCars.description = function() {

return  Цвет:  + this.gender +  ; Модель:  + this.name;

} ;

 

Наш «genericCars» это объект, который мы сможем эксплуатировать и просмотреть его описание в консоли, например:

console.log(genericCars.description());

// Цвет: Синий;  Модель: Жигули

 

Мы также сможем создавать различные автомобили, применяя созданный объект и прототипное программирование в JavaScript, как мы уже говорили, что сам процесс этот напоминает процесс «клонирования»:

var jeep = Object.create(genericCars);

 

Мы только что спроектировали Джип, при этом фактически мы просто клонировали наш объект автомобиля. Теперь давайте добавим ему какие-нибудь свойства и функции:

jeep.maxSpeed = function() {

return  "380 км/ч" ;

} ;

 

На этом еще не все, теперь мы сможем взять наш Джип  и клонировать его в другие автомобили:

var niva = Object.create(jeep);

niva.name =  "ВАЗ 2121" ;

var zaz = Object.create(jeep);

zaz.name =  "Запорожец" ;

 

Теперь внимание! Все наши созданные новые объекты (автомобили) наследуют свойства от родительского объекта, если данные свойства не были изменены. Именно так работает прототипное наследие в JavaScript. Например, если мы вызовем один из «новых» автомобилей:

console.log(zaz.description());

 

То получим следующий результат:

Цвет: Синий; Модель: Запорожец

 

Заключение

Прототипное программирование и наследие в JavaScript работает по принципу «клонирования». То есть, создавая прототип по уже созданному объекту, мы получаем новый объект, который наследует все свойства от родительского, пока мы их не поменяем.