Прототипное наследование
Давайте немного об ООП
ООП - это о том, что мы теперь будет оперировать в своей программе не только функциями, какими-либо данными в переменных и.т.п, а постараемся выражать логику в объектах которые будут инкапсулировать в себе данные и методы для работы с этими данными.
note
Советую почитать вам эту статью, которая должна расставить некоторые вещи в ваших головах.
Давайте с ходу начнем с примера кода, в котором у нас есть информация о пользователе внутри объекта и мы хотим отправить сообщение этому пользователю:
Инкапсуляция
Инкапсуляция — объект независим: каждый объект устроен так, что нужные для него данные живут внутри этого объекта, а не где-то снаружи в программе. Например, если у меня есть объект «Пользователь», то у меня в нём будут все данные о пользователе: и имя, и адрес, и всё остальное. И в нём же будут методы «Проверить адрес» или «Подписать на рассылку».
Абстракция
Мы с вами уже говорили, про абстракцию и о том, что она позволяет нам не задумываться о том, что происходит под капотом того или иного метода.
note
Абстракция это не только про ООП, создавая функцию в своей процедурной/императивной программе вы так же повышаете уровень абстракции.
Абстракция — у объекта есть интерфейс: у объекта есть методы и свойства, к которым мы можем обратиться извне этого объекта. Так же, как мы можем нажать кнопку на блендере. У блендера есть много всего внутри, что заставляет его работать, но на главной панели есть только кнопка. Вот эта кнопка и есть абстрактный интерфейс.
В программе мы можем сказать: "Удалить пользователя". На языке ООП это будет
user.delete()
— то есть мы обращаемся к объектуuser
и вызываем методdelete
. Кайф в том, что нам не так важно, как именно будет происходить удаление: ООП позволяет нам не думать об этом в момент обращения.Например, над магазином работают два программиста: один пишет модуль заказа, а второй — модуль доставки. У первого в объекте
order
есть методrevoke
. И вот второму нужно из-за доставки отменить заказ. И он спокойно пишет:order.revoke()
. Ему неважно, как другой программист будет реализовывать отмену: какие он отправит письма, что запишет в базу данных, какие выведет предупреждения.
Наследование
Наследование — способность к копированию. ООП позволяет создавать много объектов по образу и подобию другого объекта. Это позволяет не копипастить код по двести раз, а один раз нормально написать и потом много раз использовать.
Например, у вас может быть некий идеальный объект
User
: в нём вы прописываете всё, что может происходить с пользователем. У вас могут быть свойства:name
,age
,address
,card_number
. И могут быть методыenable_sale
,repeat_last_order
,get_all_orders
,call
.На основе этого идеального пользователя вы можете создать реального «Покупателя Ивана». У него при создании будут все свойства и методы, которые вы задали у идеального покупателя, плюс могут быть какие-то свои, если захотите.
Идеальные объекты программисты называют классами.
Полиморфизм
Полиморфизм — единый язык общения. В ООП важно, чтобы все объекты общались друг с другом на понятном им языке. И если у разных объектов есть метод
delete
, то он должен делать именно это и писаться везде одинаково. Нельзя, чтобы у одного объекта это былоdelete
, а у другогоerase
.
При этом внутри объекта методы могут быть реализованы по-разному. Например, удалить товар — это выдать предупреждение, а потом пометить товар в базе данных как удалённый. А удалить пользователя — это отменить его покупки, отписать от рассылки и заархивировать историю его покупок. События разные, но для программиста это неважно. У него просто есть метод
delete
, и он ему доверяет.
note
Мне не очень нравится вырезка, что приведена выше, поэтому обязательно почитайте следующую статью + я расскажу про полиморфизм на примерах чуть дальше.
Виды полиморфизма
- Ad hoc - Способ полиморфизма через перегрузку операторов или перегрузку функций
- Параметризованный полиморфизм - Через написание функций/классов способных работать с различными типами
- Полиморфизм через подтипы
danger
TODO: Дописать
Наследование в Javascript
В Javascript
используется так называемое Прототипное наследование. Т.е одни объекты могут быть прототипами(образцами
) для других, что позволяет нам:
- Не дублировать методы у схожих объектов
- Реализовывать полиморфизм через подклассы
- Лучше выражать доменную область
Цепочка прототипов
Функция-конструктор
Это функция которая как мы понимаем по названию что-то конструирует.. конструировать она будет однотипные объекты, которые будут являться экземплярами одного класса. Такие функции мы можем называть и классами.