是否可以“冻结”一套(或地图)?

时间:2015-07-20 05:08:54

标签: javascript object dictionary set

虽然Set是一个对象,但Object.freeze()适用于对象的属性,显然Map和Set不使用:例如

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

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

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

1 个答案:

答案 0 :(得分:5)

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

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

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

  2. 您可以使用不执行任何操作的方法覆盖给定.add()实例上的.clear().delete()Set,或者抛出会阻止修改的异常。如果你使这些覆盖方法不可配置,然后在对象上做了.freeze(),那么这些方法就不能被放回去了。可以直接在Set.prototype.add对象上使用Set来绕过它。