虽然Set
是一个对象,但Object.freeze()
适用于对象的属性,显然Map和Set不使用:例如
let m = new Map(); Object.freeze(m); m.set( 'key', 55); m.get( 'key' ) ==> 55
这是Chrome中的行为,我希望它是标准的。
我知道可以(有时)将Set或Map转换为普通Object,然后冻结对象。但随后在解冻和冻结版本之间进行密钥访问更改。
答案 0 :(得分:5)
有趣的问题,但目前似乎不是Set
或Map
对象上直接支持的功能。
以下是我可以考虑使用Set
对象作为指南的一些解决方法:
您可以创建一个删除.add()
,.clear()
和.delete()
的代理对象,但允许代理访问仅读取数据的所有其他方法。这将隐藏对实际Set
对象的访问,因此无法直接访问它并提供对所有其他方法的代理访问。
您可以使用不执行任何操作的方法覆盖给定.add()
实例上的.clear()
,.delete()
和Set
,或者抛出会阻止修改的异常。如果你使这些覆盖方法不可配置,然后在对象上做了.freeze()
,那么这些方法就不能被放回去了。可以直接在Set.prototype.add
对象上使用Set
来绕过它。