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

Плюсы

  • представление
  • использование памяти
  • концепцию ООП (объектно-ориентированного программирования) должен знать любой программист

Const

  • трудно обрабатывать контекст этого ключевого слова
  • горилла банан алмаз проблема 1. 2.
  • все объекты являются общедоступными

Чтобы получить общее представление о том, что такое FF (Factory Function), позвольте мне написать аналогичный код с ООП и FF.

В параметрах нашей функции мы описываем свойства со значениями по умолчанию, которые мы можем определить. Константа состояния является заменой this, которая содержит все необходимые нам свойства. В свою очередь, мы назначаем объект с методом нашему состоянию. Мы должны использовать Object.assign, а не деструктуризацию, потому что, когда мы изменим какое-то свойство, метод не будет отражать изменения.

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

Решение: контекст этого

Фактически, в приведенном выше коде мы успешно решили эту проблему, поэтому позвольте мне просто показать вам один из проблемных аспектов ключевого слова this.

Если мы нажмем на элемент #btn, в консоли мы увидим «Здравствуйте, мое имя не определено. Я говорю не определено ». Это происходит потому, что this теряет свой контекст, и вызов пытается получить свойства name и speech из контекста вызова. Чтобы решить эту проблему в ООП, мы должны связать наш метод speak с правильным контекстом this. В подходе FF нам не нужно this, все работает нормально без каких-либо привязок.

Решение: частная собственность

У классов JavaScript есть некоторые проблемы с частными значениями. Независимо от того, что TypeScript имеет ключевое слово private, только ваша IDE будет знать, что оно является частным, поэтому при запуске кода каждое свойство будет вести себя как общедоступное.

С FF вам легче управлять приватностью собственности.

В ООП, чтобы скрыть некоторые значения, мы присваиваем их константе / переменной в конструкторе. Но чтобы использовать их, мы должны переместить наш метод в конструктор, чтобы сделать частную константу / переменную в области видимости метода.

Если FF я разделил вход состояния на частные и публичные объекты. В публичном хранилище я храню все, что должно быть доступно извне, в приватном - недоступно. Вместо объекта priv можно использовать просто константу или переменную, это зависит от потребностей и вкусов.

Решение: проблема гориллы с бананом и бриллиантом

Используя Dog, вы недавно поняли, что теперь вам нужен Cat с тем же методом speak, что и в Dog, но с purr вместо pant.

В ООП, чтобы сделать наш метод speak многоразовым, мы должны добавить суперкласс Animal с методом speak и переписать класс Dog, чтобы он унаследовал от него. Класс Cat также будет унаследован от Animal, чтобы получить метод speak.

После того, как мы заменили объектные литералы на создатели функций, нам не нужно изменять иерархию наших FF, мы просто добавляем описание всех необходимых методов в объект, переданный в Object.assign.

Таким образом, если у нас есть класс 💃, у которого есть метод dance, который мы недавно решили добавить к 🐶, нам не нужно создавать суперкласс, который будет родительским для 💃и 👋, и поэтому мы не будем добавлять лишний метод в наш 😺. Нам нужно только взять танцевальный метод, который использует 💃, и добавить его к 🐶.

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

Решение: неизменяемый экземпляр

Immutable.js - классная и полезная библиотека. У него отличная идея - любое изменение значений не изменит исходное значение, оно вернет новое значение, оставив старое без изменений.

Я нашел несколько возможных реализаций этого паттерна в FF.

Здесь всякий раз, когда мы меняем какое-то значение, мы получаем полностью новый экземпляр с необходимыми нам изменениями. Метод set для вызова собственного FF с деструктуризацией старого состояния и нового свойства.

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

Последний может показаться странным, но я думаю, что он демонстрирует другой способ реализации неизменяемых данных и большие обычаи Factory Function, потому что код, который я вам показал, является только моим личным взглядом на создание объектов, вы можете настроить его, как хотите.

Если вам что-то было непонятно, оставьте комментарий. Но сначала ознакомьтесь с приведенными ниже ссылками.

Композиция превыше наследования

Композиция объектов в Javascript

Заводские функции JavaScript с ES6 +

Углерод // инструмент для создания фрагментов кода

и немного танцующей собаки