是否可以"冻结"Set(或Map)?

cc *_*ung 10 javascript dictionary object set

while Set是一个Object,Object.freeze()处理对象的属性,显然Map和Set不使用:例如

let m = new Map();
Object.freeze(m);
m.set( 'key', 55);
m.get( 'key' ) ==> 55

这是Chrome中的行为,我希望它是标准的.

我知道可以(有时)将Set或Map转换为普通Object,然后冻结对象.但随后在解冻和冻结版本之间进行密钥访问更改.

jfr*_*d00 6

有趣的问题,但目前似乎不是一个SetMap对象直接支持的功能.

以下是我可以考虑使用该Set对象作为指南的一些解决方法:

  1. 你可以创建一个删除代理对象.add(),.clear().delete(),但让刚刚读取数据的所有其他方法代理的访问.这将隐藏对实际Set对象的访问,因此无法直接访问它并提供对所有其他方法的代理访问.

  2. 您可以覆盖.add(),.clear().delete()在给定的Set实例上使用不执行任何操作的方法或引发会阻止修改的异常.如果您使这些覆盖方法不可配置,然后.freeze()对该对象执行了操作,则无法放回这些方法.可以Set.prototype.add直接在Set对象上使用但仍然绕过它.