Перейти к основному содержимому

Что это такое

Паттерн Prototype создаёт новые объекты, клонируя существующий, вместо того чтобы собирать их с нуля. Вы готовите один объект как шаблон, затем копируете его и меняете только то, что отличается.

Главное, что важно понять: обычная копия — поверхностная. Расширение объекта, { ...doc }, копирует ссылку на массив тегов, поэтому копия и оригинал по-прежнему используют один массив — добавьте элемент в один, и другой тоже изменится. Правильный метод clone() копирует и массив, поэтому клон становится по-настоящему независимым.


Пример: шаблон документа

Шаблон содержит те части, которые повторяются в каждом документе. clone() копирует его — включая массив тегов — поэтому правка копии не затрагивает шаблон.

Клонируйте, затем измените отличие

Отчёт получил новый заголовок и дополнительный тег, а в шаблоне по-прежнему только [ 'черновик' ] — потому что clone() скопировал массив через [...tags], а не разделил его. Для простых данных без методов встроенный structuredClone() делает такую же глубокую копию одним вызовом.

Prompt
Напишите программу на TypeScript с классом TextDocument (title, footer, массив tags) и методом clone, который копирует документ вместе со свежей копией его массива tags. Клонируйте шаблон в отчёт, измените title отчёта и добавьте лишний тег, затем выведите title и tags обоих, чтобы показать, что шаблон не изменился.
Вывод: программа на TypeScript и захваченный вывод

Когда его использовать

Используйте его, когда новые объекты — это в основном копии заранее подготовленного: документы из шаблона, игровые сущности из спавнера, тестовые данные из фикстуры.

Не используйте его, когда объекты дёшево создавать заново или когда они содержат только простые значения. Для плоского объекта из строк и чисел копия через расширение { ...doc } уже является полной копией.


Плюсы и минусы

Плюсы: дешёвое создание заранее настроенных объектов; шаблон документирует значения по умолчанию; нет повторяющегося кода настройки.

Минусы: в глубоком копировании легко допустить незаметную ошибку — забытый массив или вложенный объект тихо связывает клон и оригинал; со временем клоны незаметно расходятся с шаблоном.