覆盖对象

时间:2015-05-11 08:35:46

标签: javascript immutability

我最近在查看Facebook's Immutable-JS库,看到了以下有趣的行为:

var map1 = Immutable.Map({a:1, b:2, c:3});
var clone = map1;

图书馆确保map1 !== clone

这是如何实现的?我怀疑有可能覆盖一个检索对象引用的属性方法,就像Object.prototype.valueOf在需要对象的原始值时那样做,但是不能找到任何类似的东西。

1 个答案:

答案 0 :(得分:1)

查看文档,我认为您并不了解它是如何工作的:您没有使用Javascript语法object['key'] = value设置/取消设置密钥,而是使用map.set('key', val) 。然后你程序员必须将结果对象分配给某个变量,因为更新没有写入:它返回一个修改过的(而且是不可变的副本)。作为优化,如果.set()实际上没有更改密钥的值,则返回this,因此您可以断言参考相等

似乎作为捕获编程错误的帮助,当您尝试使用immutableMap.key = 'val'设置密钥时,库也会抛出错误(尽管使用immutableMap.key读取应该是安全的)