我可以在JavaScript中冻结Set或Map吗?
冻结一个对象相对简单,使用Object.freeze()
即可。然而,当涉及到冻结一个Set
或Map
时,情况就变得有些复杂了。Set
和Map
对象有它们自己的添加、删除和清除元素的方法,这在尝试冻结它们时可能会有问题。
幸运的是,它们毕竟是对象,你可以很容易地覆盖这些方法以防止它们被使用。
冻结一个Set
对象
为了冻结一个Set
对象,你可以简单地将Set.prototype.add()
、Set.prototype.delete()
和Set.prototype.clear()
方法设置为undefined
。这将有效地防止它们被使用,实际上冻结了这个对象。除此之外,你可以使用Object.freeze()
来冻结Set
对象本身。
const frozenSet = iterable => {
const s = new Set(iterable);
s.add = undefined;
s.delete = undefined;
s.clear = undefined;
return Object.freeze(s);
};
frozenSet([1, 2, 3, 1, 2]);
/* Set {
1, 2, 3,
add: undefined, delete: undefined, clear: undefined
} */
冻结一个Map
对象
冻结一个Map
对象与冻结一个Set
对象非常相似。你可以将Map.prototype.set()
、Map.prototype.delete()
和Map.prototype.clear()
方法设置为undefined
,然后使用Object.freeze()
来冻结Map
对象本身。
const frozenMap = iterable => {
const m = new Map(iterable);
m.set = undefined;
m.delete = undefined;
m.clear = undefined;
return Object.freeze(m);
};
frozenMap([['a', 1], ['b', 2]]);
/* Map {
'a' => 1, 'b' => 2,
set: undefined, delete: undefined, clear: undefined
} */
frozenMap([['a', 1], ['b', 2]]); / Map { 'a' => 1, 'b' => 2, set: undefined, delete: undefined, clear: undefined } / ```