到目前为止共享结构不变的对象,也似乎是不可改变的两个对立的解决方案,在Javascript:是否有意义创建利用JavaScript的原型系统
- immutable.js
- 无缝不变
immutable.js引入了与对象和数组的默认javascript协议不兼容的自己(浅)不可变对象。
seamless-immutable使用完全不变的POJO,没有任何魔法,但没有结构共享。
将两个世界的最好结合起来会很棒。难道不可变的原型链/树会是一个合适的解决方案吗?
的基本原型机制带来了希望:
var a = [1, 2, 3];
var b = Object.create(a);
b[0]; // 1
b.map(function (x) { return ++x; }); // 2, 3, 4
b.push(4, 5, 6); // initial assignment of b
a; // 1, 2, 3
b; // 1, 2, 3, 4, 5, 6
for (var i = 0; i < b.length; i++) {
console.log(b[i]);
} // 1, 2, 3, 4, 5, 6
a[1] = null; // prototype mutation
a; // 1, null, 3
b; // 1, null, 3, 4, 5, 6
b.unshift(0); // instance mutation
a; // 1, null, 3
b; // 0, 1, null, 3, 4, 5, 6 !!!
每当当前实例(B)的突变(不印字)使得它不可能为它的原型来提供他们的价值观,JS引擎似乎复制这些值自动直接进入实例。我不知道,但它总是有意义的。
然而,不可变的工作(键/索引)对象一个快速遇到的问题:
var a = [1, 2, 3];
Object.freeze(a);
var b = Object.create(a);
b.push(4, 5, 6); // Error: Cannot assign to read only property "length"
Object.freeze(b);
这一个是简单的:length属性从不可改变原型继承,并因此不可变。解决问题并不难:
var b = Object.create(a, {length: {value: a.length, writable: true}});
但是可能会有其他问题,特别是在更复杂的现实世界的情况下。
也许有人已经处理了这个想法,可以告诉我,如果值得推理的话。
Aadit的answer相关的问题和Bergi的评论触及我的问题,没有给出答案。
我觉得这会让一个**真的有趣的讨论,但不是正确的Stack Overflow讨论更具体的问题)。一旦你打到20代表,你应该完全来和我们在[聊天](https://chat.stackoverflow.com/rooms/17/javascript)讨论。 –
是的,我不想在那边与Aadit进行讨论,但我很乐意在这里提供答案。并希望@AaditMShah可以提供一些对应点,我想学习一些新的:-) – Bergi