Основная идея объектно-ориентированного программирования заключается в организации нашего кода путем разбиения вещей на объекты. Это поможет нам улучшить ремонтопригодность, масштабируемость, возможность повторного использования и т. д. Когда мы обсуждаем объектно-ориентированное программирование, первое, что всплывает, это 4 столпа ООП, а именно наследование, абстракция, инкапсуляция и полиморфизм. Если мы связываем эти понятия с абстрактным ключевым словом или спецификаторами доступа, такими как public или private, как это доступно в java или C #, мы не можем найти их в javascript. Но есть способы, которыми эти концепции могут быть реализованы в javascript. Может быть, мы можем попытаться объяснить эти концепции с помощью машинописного текста в другой статье, но пока это javascript.

Нам нужно понимать, что javascript отличается, как мы обсуждали в статье о прототипе. Вся концепция наследования в javascript основана на прототипе. В этой статье мы собираемся обсудить способы и средства, с помощью которых мы можем создавать объекты в javascript. В процессе мы обсудим фабричные функции, функции-конструкторы, классы JavaScript и способы расширения классов. Итак, давайте начнем.

Например, мы будем использовать контекст «Сотрудник компании» и «оплата работнику». Это будет изменение от обычных транспортных средств, автомобилей, животных примеров для объяснения объектно-ориентированной концепции.

Сначала мы увидим, как создавать объекты с помощью фабричных функций.

Здесь мы напишем функцию, которая действует как фабрика по созданию объектов, поэтому функция называется фабрикой. Поскольку мы хотим, чтобы объекты сотрудников соответствовали нашему примеру оплаты труда сотрудников в компании. Назовем нашу фабричную функцию makeEmployee.

Мы объявляем пустой объект внутри нашей фабричной функции и добавляем к нему свойства и методы перед его возвратом.

Мы можем создать столько объектов, сколько захотим, используя эту фабричную функцию. e1 — один из таких объектов сотрудников, которые мы создали с помощью нашей фабричной функции.

Если мы увидим созданный объект, к нему будут добавлены свойства и методы, определенные в фабричной функции. Но они не добавляются в свойство __proto__.

Это означает, что метод ComputePay для разных созданных объектов сотрудников не одинаков, метод calculatePay для каждого объекта, даже если, имея одинаковую функциональность, являются разными копиями одного и того же метода. Но если мы проверим стандартный объект, такой как строка, доступные методы будут одинаковыми для разных экземпляров строки.

Тройное равенство проверяет, совпадают ли методы. Строковые объекты получают свои свойства и методы через прототипы, поэтому они ссылаются на одни и те же методы, тогда как в нашем случае к каждому объекту привязаны разные методы.

Это приводит нас к функциям-конструкторам. Подобно тому, что вы видите на экране, мы создаем функцию и инстанцируем ее с помощью нового оператора.

Обратите внимание на значение this, если оно используется без оператора new, значением this будет window. Но с новым оператором он указывает на объект.

См. метод calculatePay, хотя он доступен для объекта. Он не добавляется в свойство __proto__.

Чтобы сделать его доступным для свойства __proto__, нам придется удалить его из функции и добавить в объект-прототип сотрудника.

Теперь у объекта будет метод, но, что более важно, он доступен через прототип, что позволяет избежать создания отдельного метода для каждого создаваемого объекта.

Здесь следует отметить одну вещь: не используйте стрелочные функции, так как в качестве значения для этого будет указано окно.

Итак, функция-конструктор и добавление методов к прототипу делают свое дело. Но это выглядит немного неуклюжим с точки зрения читабельности кода. Но javascript предоставляет нам некоторый синтаксический сахар, что означает, что под капотом происходит то же самое, но мы можем написать и представить это с более чистым и читаемым синтаксисом.

Поэтому для этого мы добавляем класс, а затем добавляем конструктор, который запускается сразу при создании экземпляра объекта. Затем мы добавляем свойства с этим ключевым словом. В классе мы добавим метод прямо в класс, синтаксис почти как у функции без ключевого слова function.

Мы создаем объекты с помощью оператора new, как и с функциями конструктора. Метод вычисления оплаты доступен объекту через свойство __proto__ (как в pic4).

Теперь наследование, мы можем иметь класс подрядчика, расширяющий класс сотрудника. Мы можем переопределить метод оплаты вычислений. Если есть какие-либо дополнительные параметры, которые необходимо передать конструктору, которые можно разместить. Все параметры, общие с родительским конструктором, могут быть отправлены в родительский конструктор с помощью super.

Когда мы создаем объекты из класса Contractor, он может иметь другую реализацию ComputePay, как мы сделали в определении класса. Объект, созданный с помощью класса employee, будет иметь исходную реализацию calculatePay. А также посмотрите прототип объекта подрядчика, как и ожидалось, это будет объект сотрудника.

Это охватывает основы объектно-ориентированных концепций в javascript и роль прототипного наследования в нем.