☕ Учебник по JavaScript: ООП на простых примерах
Познакомимся с наследованием, инкапсуляцией, абстракцией и полиморфизмом. А также научимся создавать объекты и использовать синтаксический сахар class.
Что такое ООП?
Объектно-ориентированное программирование (ООП) – это парадигма программирования, основанная на концепции классов и объектов. Она используется для структурирования программы на основе объектов, обычно называемых классами.
Объект имеет в себе поля и методы. В качестве полей выступают различные типы данных, такие как int
, string
и т. д. В качестве методов – функция, которая выполняет то или иное действие. В качестве примера возьмем клиента банка.
У клиента есть:
- Имя.
- Фамилия.
- Отчество.
- ИНН.
- и т. д.
Приведенные выше параметры являются полями у объекта. Но не будет забывать про методы. Что может делать клиент:
- Снимать деньги.
- Пополнять.
- Оплачивать.
- Открыть счет.
- и т. д.
Приведенные примеры показывают возможности объекта в определенной сфере. То есть тот же клиент в страховой и авиакомпании будет иметь разные поля и разные методы.
Итог: ООП это парадигма программирования, в которой используется объект, состоящий из полей и методов.
Способы создания объекта в JavaScript
Есть несколько способов создания объектов в JS. Пример создания объекта с полями и методами:
При создании одиночного объекта каждый раз приходится создавать одинаковые поля и методы. Для того чтобы сделать создание объектов удобным, в JS приведен функциональный cпособ создания объекта с помощью конструктора:
Таким образом, конструктор объекта помогает нам повторно использовать литерал объекта.
ES6 – class и синтаксический сахар
В ES6 был добавлен синтаксический сахар class
. Класс – это абстрактное представление объекта, который облегчает использование ООП в JavaScript. Пример использования показан ниже.
Класс User
имеет поля и методы. В данном примере name
, userName
, password
являются полями класса. Также представлен метод login
, который при верном пароле и логине выводит соответствующее сообщение.
При создании объекта из класса с помощью ключевого слова new
, JavaScript внутренне вызывает метод конструктора, который инициализирует публичные и приватные свойства класса.
По умолчанию все свойства, объявленные в классе, являются публичными. Их можно вызывать и изменять вне класса. Здесь name
и userName
являются публичными свойствами.
Символ #
указывает на то, что это свойство является приватным для класса, и только методы, объявленные внутри класса, могут получить к нему доступ. Приватные свойства должны быть объявлены до их использования.
Для печати/изменения приватных свойств нам нужны методы getter/setter. Например, метод setPassword
является тем самым setter, который изменяет значение password
.
Наследование
При наследовании один класс получает свойства и методы другого класса. Класс, который наследует свойство, называется подклассом или дочерним классом. Класс, свойства которого наследуются, называется суперклассом или родительским классом.
Наследование является основной парадигмой ООП. Преимуществом наследования является возможность повторного использования написанного кода. Когда дочерний класс наследует методы от родительского класса, нам не нужно переписывать уже написанные методы, которые были в родительском классе.
В приведенном выше примере классы Author
и Admin
наследуют свойство класса User
с помощью ключевых слов extends
и super
.
Ключевое слово extends
используется для установления отношений родитель-ребенок между двумя классами. В первом случае Author
становится подклассом, а User
– родительским классом.
Подкласс имеет доступ ко всем публичным и защищенным членам суперкласса. Кроме того, он может иметь свои собственные свойства и методы. Так мы можем достичь повторного использования через наследование.
Ключевое слово super
– это специальное ключевое слово. Вызов super
в конструкторе дочернего класса вызывает конструктор родительского. Так мы инициализируем свойства в классах Author
и Admin
.
Инкапсуляция
Инкапсуляция определяется как связывание данных и методов в единое целое для защиты от доступа извне, подобно тому как таблетка содержит лекарство внутри своей оболочки.
В контексте класса к некоторым свойствам нельзя получить прямой доступ извне класса и необходимо вызвать соответствующий метод для этих свойств.
Это похоже на создание метода getter/setter для private
свойств, которые объявляются в классе.
В приведенном выше примере уже использована инкапсуляция. Например, изменение пароля для User
c помощью метода resetPassword
, где идет обращение к private
свойству password
, чтобы изменить значение.
Абстракция
Люди часто путают инкапсуляцию с абстракцией. Абстракция – демонстрация только основных вещей и сокрытие внутренней реализации.
Рассмотрим пример с автомобилем. Автомобиль выполняет некоторые действия, такие как старт, движение и остановка. Каждое действие приводит к результату. Плюс, эти действия имеют определенные поддействия, которые скрыты от вас, но вам не нужно заботиться об этих поддействиях. Например, пользователь не должен понимать, как работает зажигание или как поступает бензин, а важно знать, что есть кнопка старт, которая запускает двигатель.
Пример использования в JavaScript:
Вышеуказанный пример наглядно показывает использование абстракции в JavaScript. Например, для пользователя достаточно только иметь метод sign up
(регистрация), а все остальное знать необязательно.
Полиморфизм
Полиморфизм уменьшает дублирование участков кода. Существуют два типа использования полиморфизма:
- Полиморфизм во время компиляции
- Полиморфизм во время выполнения
Перегрузка функций – это тип полиморфизма во время компиляции. Этот тип создает более одной функции с одинаковым именем и разными параметрами или типами. Но перегрузка функций не поддерживается в JavaScript, потому что при создании функций с одинаковыми именами JavaScript переопределит последнюю функцию.
Переопределение методов – это тип полиморфизма во время выполнения. Например, используется для переопределения методов родительского класса в дочернем классе.
Пример использования в JavaScript:
В примере Author
и Admin
наследуются от класса User
. Оба класса имеют метод login
, который принадлежит User
. Только для администратора необходимо поставить дополнительный уровень проверки. Это достигается с помощью переопределения метода login
и добавления дополнительных проверок. Просто перезаписываем название. Таким образом, можно достичь полиморфизма в JavaScript.