当前位置: 代码迷 >> JavaScript >> 是否可以“冻结”集合(或地图)?
  详细解决方案

是否可以“冻结”集合(或地图)?

热度:96   发布时间:2023-06-13 12:50:12.0

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

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

这是Chrome的行为,我希望这是标准行为。

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

有趣的问题,但当前似乎不是SetMap对象上直接支持的功能。

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

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

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

  相关解决方案