«Это технически возможно»
Да, реализация вы описали бы решить эту конкретную проблему, но Неизменное делает больше, чем просто предоставление данных структур вы не разрешается напрямую изменять:
Immutable
Предоставляет постоянный неизменяемый List
, Stack
, Map
,, Set
, OrderedSet
и Record
. Это высокоэффективны для современных JavaScript-виртуальных машин, используя структурный обмен через попытки хэш-карт и векторные попытки, которые популяризируются Clojure и Scala, сводя к минимуму необходимость копировать или кэшировать данные.
Immutable
также обеспечивает ленивый Seq
, что позволяет эффективно цепочки методов сбора, как map
и filter
без создания промежуточных представлений. Создайте Seq
с Range
и Repeat
.
Emphasis mine.
Так что, если у вас есть огромный набор вложенных неизменных Карты и списки, и вы измените один элемент (то есть: вы создаете новую структуру с преимущественно теми же данными, но одна вещь отличается), Неизменный будет иметь для совместного использования большого количества данных между двумя структурами данных, что делает работу быстрее и потребляет меньше памяти.
Однако это означает, что значение someValue
не обязательно хранится в верхней части структуры данных, ожидая, что вы получите к нему доступ; Неизменяемый должен проникнуть внутрь, чтобы найти его для вас, поэтому необходимо, чтобы get
.
Я подозреваю, что вы могли бы создать очень крутой и дружественный API, используя Symbols (чтобы скрыть основные структуры данных) и Proxies (перехват proprety аксессоров), но browser support is practically non-existent.
«И есть ли какая-либо библиотека, которая уже делает что-то подобное?«
Ближайшая вещь, о которой я могу думать в данный момент, - React's immutable helpers. Синтаксис обновления немного шумный, чтобы поддерживать широкий диапазон операций, но то, что вы выбрали на другом конце, это простые объекты и массивы JavaScript .
Работа с неизменными данными в JavaScript является более сложным, чем в языках, предназначенные для этого, как Clojure. Тем не менее, мы предоставили простую помощник неизменности, update()
, что делает дело с этим типом данных намного проще, без кардинально меняется, как ваши данные представлены.
Помощник рода предполагает объектов вы передаете в неявно неизменны, но нет никаких причин, вы не могли deeply freeze их.
вы можете заморозить простой объект и получить доступ к нему в обычном режиме. вы также можете создать обертку вокруг своей неизменяемой структуры, используя Object.defineProperty для создания геттеров, которые вызывают .get() внутри. – dandavis