Задать вопрос

JS immutable «из коробки»?

Суть вопроса: если прототипное наследование в JS по-сути подразумевает иммутабильность по-умолчанию, почему это не используется повсеместно? Ну или как минимум в тех проектах, для которых это важно. Почему такие библиотеки как immutable.js не используют стандартные механизмы JS, а реализуют все вручную?

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

Если кто-то знает более точно - буду рад ответам. Спасибо!

UPDATE 1:

Честно говоря, с иммутабельностью особого опыта нет. Всегда казалось, что это прерогатива академических языков, типа Haskell и что на реальных проектах - это большой оверхед. Поэтому спецов прошу строго не ругать.

UPDATE 2:
Судя по набежавшим комментариям, мой вопрос бы сформулирован слишком обще, поэтому следует уточнить. Вообще, иммутабельностью имеет разные формы, но в общем смысле - это объект, состояние которого не может быть изменено после создания. Чистой иммутабельности в JS конечно же нет, также как и многих других парадигм, которые он в себе частично реализует (например ФП). Небольшой пример (чур за код не ругать, будем считать что это "псевдо-код"):

immutable.js
var Immutable = require('immutable');
var map1 = Immutable.Map({a:1, b:2, c:3});
var map2 = map1.set('b', 50);
map1.get('b'); // 2
map2.get('b'); // 50
map1.get('a'); // 1
map2.get('a'); // 1


vanilla js
var map1 = {a:1, b:2, c:3};
var map2 = Object.create(map1);
map2.b = 50;

console.log(map1.b); // 2
console.log(map2.b); // 50
console.log(map1.a); // 1
console.log(map2.a); // 1


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

var map3 = Object.getPrototypeOf(map2);
console.log(map1.b); // 2
console.log(map2.b); // 50
console.log(map3.b); // 2


UPDATE 3:
Чтобы избежать дальнейшего недопонимания. Вопрос не содержит утверждения, что в JS есть все фичи и конструкции языков, где иммутабельность стоит во главе угла. Вопрос скорее о том, почему базовая иммутабельность цепочки прототипов не используется при создании библиотек, реализующих иммутабельность в JS? На первый взгляд это хорошая база.
  • Вопрос задан
  • 1550 просмотров
Подписаться 4 Оценить 11 комментариев
Решения вопроса 1
KindWizzard
@KindWizzard
Забавно, я столкнулся со схожей проблемой, но Immutable.js от Facebook показался мне overhead-ом, к тому же не самым производительным. Реализовал на прототипном наследовании, т.к. был уверен, что Immutable.js внутри именно такие механизмы и использует. Object.create работает моментально, экспорт огромный структуры работает за миллисекунды.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
nazarpc
@nazarpc
Open Source enthusiast
Нет там иммутабельности, потому и не используют.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы