问题描述
尽管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来绕过它。