Что это такое
Паттерн Prototype создаёт новые объекты, клонируя существующий, вместо того чтобы собирать их с нуля. Вы готовите один объект как шаблон, затем копируете его и меняете только то, что отличается.
Главное, что важно понять: обычная копия — поверхностная. Расширение объекта, { ...doc }, копирует ссылку на массив тегов, поэтому копия и оригинал по-прежнему используют один массив — добавьте элемент в один, и другой тоже изменится. Правильный метод clone() копирует и массив, поэтому клон становится по-настоящему независимым.
Пример: шаблон документа
Шаблон содержит те части, которые повторяются в каждом документе. clone() копирует его — включая массив тегов — поэтому правка копии не затрагивает шаблон.
Клонируйте, затем измените отличие
Отчёт получил новый заголовок и дополнительный тег, а в шаблоне по-прежнему только [ 'черновик' ] — потому что clone() скопировал массив через [...tags], а не разделил его. Для простых данных без методов встроенный structuredClone() делает такую же глубокую копию одним вызовом.
Вывод: программа на TypeScript и захваченный вывод
class TextDocument {
title: string
footer: string
tags: string[]
constructor(title: string, footer: string, tags: string[]) {
this.title = title
this.footer = footer
this.tags = [...tags]
}
// clone копирует документ — включая массив внутри него.
clone(): TextDocument {
return new TextDocument(this.title, this.footer, this.tags)
}
}
const template = new TextDocument("Без названия", "PromptCookbook 2026", ["черновик"])
const report = template.clone()
report.title = "Годовой отчёт"
report.tags.push("финансы")
console.log("шаблон:", template.title, template.tags)
console.log("клон: ", report.title, report.tags)
Когда его использовать
Используйте его, когда новые объекты — это в основном копии заранее подготовленного: документы из шаблона, игровые сущности из спавнера, тестовые данные из фикстуры.
Не используйте его, когда объекты дёшево создавать заново или когда они содержат только простые значения. Для плоского объекта из строк и чисел копия через расширение { ...doc } уже является полной копией.
Плюсы и минусы
Плюсы: дешёвое создание заранее настроенных объектов; шаблон документирует значения по умолчанию; нет повторяющегося кода настройки.
Минусы: в глубоком копировании легко допустить незаметную ошибку — забытый массив или вложенный объект тихо связывает клон и оригинал; со временем клоны незаметно расходятся с шаблоном.