覆盖返回的对象引用
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
读取应该是安全的)
我最近在研究 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
读取应该是安全的)