Впервые я узнал об объектно-ориентированном программировании, когда начал свое путешествие по разработке программного обеспечения в школе Flatiron. Я сомневаюсь, что кто-то, начав с Square One, как я, смог бы впитать это на глубоком уровне. Суть буткемпа в том, что вы держитесь за него ногтями! Так что я решил, что обзор/переподготовка необходимы, особенно учитывая, что обсуждение функционального программирования против ООП, вероятно, не будет решено в ближайшее время.
ООП, конечно же, является сокращением от объектно-ориентированного программирования и существует с конца 50-х/начала 60-х. Что касается JavaScript, ООП стал доступен с ES6 в 2015 году. Из-за этого JavaScript считается мультипарадигмальным — мы можем писать JavaScript, используя чистые функции, или мы можем имитировать реальный мир, используя принципы ООП для структурирования нашего кода.
В общих чертах, ООП — это парадигма программирования или набор концепций, в которых код организован таким образом, что он создает план, сосредоточенный вокруг созданного объекта — обычно через классы — который содержит состояние и поведение. т. е. вещи, которые объект имеет (характеристики/атрибуты) и вещи, которые объект делает (методы/функции). Каждый экземпляр этого класса является объектом, который также будет создавать экземпляр своего индивидуального состояния и имеет доступ к своим унаследованным функциям. Так что мы можем создать, скажем, животное. У этого животного может быть имя, различные характеристики и вещи, которые оно делает, например, речь. "Мяу."
Четыре столпа ООП — это инкапсуляция, наследование, абстракция и полиморфизм. Эти термины были описаны многими способами. Вот как я их понимаю:
1) Инкапсуляция: код организован в контейнеры для лучшей организации, что позволяет избежать дублирования кода. Это бьющееся сердце ООП. Инкапсуляция также позволяет нам скрыть метод или атрибут, чтобы их нельзя было случайно изменить или иным образом испортить. (Обратите внимание на очень новый #
, который в данном случае не предназначен для публикации в социальных сетях, а вместо этого используется для создания и использования закрытых переменных и методов внутри классов в JavaScript! Вы можете увидеть его использование в примере кода ниже.)
2) Наследование: любой экземпляр класса наследует переменные и методы этого класса, а также любое состояние и/или поведение, которые могут быть унаследованы от супер(или родительских) классов этого класса. Эта дополнительная сверхспособность (видите, что я там сделал?) требует использования ключевого слова super()
.
3) Абстракция: этим милым маленьким объектам-экземплярам не нужно беспокоиться о том, «как». Они могут просто вызвать метод и позволить классу позаботиться о деталях.
4) Полиморфизм. Метод можно запрограммировать так, чтобы он вел себя по-разному в зависимости от того, кто его вызывает. (т. е. собака будет лаять, а кошка мяукать.) Подкласс может даже перезаписать функцию, которая была указана в его суперклассе. Эта новая и улучшенная функциональность инкапсулирована/защищена внутри собственного класса. Столько силы!
Интересно, что если мы используем функциональное программирование — т. е. если мы создаем объект функционально — у нас есть доступ к this
(в его правильном контексте созданного объекта), у нас есть встроенная функция конструктора JavaScript, и объект возвращается автоматически. Все это нам предоставляется, если мы используем ключевое слово new
. Это имитирует ООП, но это не ООП. Вы даже можете вкладывать функции внутрь этих «смежных с ООП» функций, хотя это не рекомендуется из-за дополнительного пространства памяти, которое потребуется для каждого экземпляра нового объекта.
Использование классов (см. ниже) — это то, как мы пишем JavaScript в стиле ООП, который лучше, по крайней мере, с точки зрения объема памяти. Когда создается новый экземпляр, он может найти функции, к которым у него есть доступ, но ему не нужно резервировать место в памяти для самих функций.
Ключевое слово static
зарезервировано для методов и свойств класса, а методы экземпляра не используют static
. И, конечно же, переменные экземпляра используют this
. (Методы также могут использовать this
.)
Забавный факт: ООП-классы в JavaScript — это не совсем ООП. На самом деле это синтаксический сахар (т. е. магия. Не заглядывайте за кулисы!), который выглядит и ведет себя как ООП, но под капотом представляет собой просто прототип наследования. Например, если бы мы обратились к console.log drMontgomery.__proto__
, то увидели бы это:
Здесь мало что отличается от того, если бы мы создали новый массив и проверили его свойство __proto__:
Я обнаружил, что мне нравится ООП, чем больше я его узнаю. И хотя функциональное программирование и хуки в моде в React.js, теперь я с большим уважением отношусь к OG-классам в React. Как и в случае с типичным ООП, когда мы смотрим на класс, унаследованный от React, он наследует многие методы, наиболее важные из которых — методы жизненного цикла (render()
сам по себе является методом жизненного цикла. В прошлом я имел тенденцию забывать об этом). Обратите внимание на ключевое слово extends
. ООП!
Всем удачного кодирования! Я хотел бы узнать, что вы думаете об ООП, и есть ли у вас предпочтения в отношении ООП по сравнению с функциональным программированием.
Я очень-очень рекомендую этот курс от Андрея Неагойе: https://www.udemy.com/course/advanced-javascript-concepts/