虽然Set
是一个对象,Object.freeze()
作用于对象的属性,而显然Map和Set不使用:例如
let m = new Map();
Object.freeze(m);
m.set('key', 55);
m.get('key'); // ==> 55
这是在Chrome中的行为,我认为这是标准的。
我理解有时可以将Set或Map转换为普通对象,然后冻结该对象,但是在未冻结和冻结版本之间键访问会发生变化。
虽然Set
是一个对象,Object.freeze()
作用于对象的属性,而显然Map和Set不使用:例如
let m = new Map();
Object.freeze(m);
m.set('key', 55);
m.get('key'); // ==> 55
这是一个有趣的问题,但目前似乎不是Set
或Map
对象上直接支持的功能。
以下是一些我可以想到使用Set
对象作为指南的解决方法:
你可以创建一个代理对象,删除.add()
,.clear()
和.delete()
,但允许代理访问所有其他仅读数据的方法。这将隐藏对实际Set
对象的访问,因此没有直接访问它并提供代理访问所有其他方法的方式。
你可以覆盖给定Set
实例上的.add()
,.clear()
和.delete()
,使其成为什么都不做或抛出异常的方法,从而防止修改。如果您使这些重写方法不可配置,然后对对象执行.freeze()
,这些方法将无法被放回。 但是,可以直接在Set
对象上使用Set.prototype.add
绕过它。