Прототипное программирование и прототипное наследование часто применяют в 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 работает по принципу «клонирования». То есть, создавая прототип по уже созданному объекту, мы получаем новый объект, который наследует все свойства от родительского, пока мы их не поменяем.
Другое