问题描述
尽管Set
是一个对象,但Object.freeze()
处理该对象的属性,显然Map和Set不会使用:例如
let m = new Map(); Object.freeze(m); m.set( 'key', 55); m.get( 'key' ) ==> 55
这是Chrome的行为,我希望这是标准行为。
我知道可以(有时)将Set或Map转换为普通对象,然后冻结该对象。 但随后,密钥访问会在未冻结版本和冻结版本之间进行更改。
1楼
有趣的问题,但当前似乎不是Set
或Map
对象上直接支持的功能。
我可以考虑使用Set
对象作为指导的一些解决方法:
您可以创建一个代理对象,该代理对象删除了
.add()
.clear()
和.delete()
,但是允许代理访问所有其他仅读取数据的方法。 这将隐藏对实际Set
对象的访问,因此将无法直接访问它并提供对所有其他方法的代理访问。您可以使用不执行任何操作或引发阻止修改的异常的方法覆盖给定
Set
实例上的.add()
.clear()
和.delete()
。 如果使这些重写方法不可配置,然后对对象执行.freeze()
,则这些方法将无法退回。 可以直接在Set
对象上使用Set.prototype.add
来绕过它。