Проблема: я переписываю функцию, которая возвращает большой простой объект javascript. Исходный объект не должен изменяться вызывающими объектами. Функция в настоящее время вызывается сотнями абонентов.
Некоторые решения:
- Вернуть глубокую копию объекта. Это текущее решение. Это плохо, потому что (а) объект очень большой и (б) в 90% случаев клон не нужен, потому что большинство вызывающих объектов не изменяют значение.
- Вернуть ссылку на объект. Это плохо, потому что вызывающие смогут изменять исходный объект, чего я не хочу.
- Верните ссылку с
Object.freeze
или чем-то подобным. Это могло бы сработать, если бы я мог гарантировать, что вызывающая сторона не попытается изменить возвращаемое значение. Но я не могу реально гарантировать это. Опять же, функция вызывается сотнями вызывающих объектов, и многие из них уже изменяют значение (клон).
Мне нужно решение для копирования при записи, которое имеет следующие два свойства:
- Возвращаемое значение функции является ссылкой на исходный объект, пока значение не будет изменено.
- После изменения значения оно становится глубоким клоном исходного объекта.
Я провел несколько тестов и могу реализовать это с помощью Javascript Proxy а>. Просто перехватите все операции, которые изменяют цель (например, set
, deleteProperty
, defineProperty
и т. д.), чтобы отслеживать изменения. Затем перехватите get
, чтобы вернуть ссылку, если не было внесено никаких изменений, и вернуть клон, если изменения были внесены. Прокси-сервер также должен быть глубоким прокси-сервером, чтобы прослушивать изменения во вложенных свойствах.
Хотя я могу реализовать это сам, мне было интересно, есть ли уже какие-либо реализации. Я бы предпочел не изобретать велосипед, если в этом нет необходимости. Совместимость с браузером хороша, но не обязательна.
cow
это то, что вам нужно npmjs.com/package/cow - person artanik   schedule 15.02.2020