覆盖返回的对象引用

Override returned reference of object

我最近在研究 Facebook's Immutable-JS 库,发现了以下有趣的行为:

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

图书馆确保 map1 !== clone.

这是如何实现的?我怀疑可以重写检索对象引用的 属性 方法,就像 Object.prototype.valueOf 在需要对象的原始值但找不到任何此类内容时执行此操作一样。

查看文档,我认为您不明白它是如何工作的:您没有使用 Javascript 语法 object['key'] = value 的 set/unset 键,而是使用 map.set('key', val)。然后你 程序员 必须将结果对象分配给某个变量,因为更新不会写在适当的位置:它 returns 一个修改的(而不是不可变的副本)。作为优化,如果 .set() 实际上没有改变键的值,它 returns this,所以你可以断言引用相等

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