Суть вопроса: если прототипное наследование в JS по-сути подразумевает иммутабильность по-умолчанию, почему это не используется повсеместно? Ну или как минимум в тех проектах, для которых это важно. Почему такие библиотеки как immutable.js не используют стандартные механизмы JS, а реализуют все вручную?
Первое что приходит на ум - скорость работы. Вероятно прототипы работают медленно, не смотря на то, что являются чуть ли не основой объектов языка.
Если кто-то знает более точно - буду рад ответам. Спасибо!
UPDATE 1:
Честно говоря, с иммутабельностью особого опыта нет. Всегда казалось, что это прерогатива академических языков, типа Haskell и что на реальных проектах - это большой оверхед. Поэтому спецов прошу строго не ругать.
UPDATE 2:
Судя по набежавшим комментариям, мой вопрос бы сформулирован слишком обще, поэтому следует уточнить. Вообще, иммутабельностью имеет разные формы, но в общем смысле - это объект, состояние которого не может быть изменено после создания. Чистой иммутабельности в JS конечно же нет, также как и многих других парадигм, которые он в себе частично реализует (например ФП). Небольшой пример (чур за код не ругать, будем считать что это "псевдо-код"):
immutable.jsvar 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 jsvar 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? На первый взгляд это хорошая база.