Skip to content

我可以在JavaScript中冻结Set或Map吗?

冻结一个对象相对简单,使用Object.freeze()即可。然而,当涉及到冻结一个SetMap时,情况就变得有些复杂了。SetMap对象有它们自己的添加、删除和清除元素的方法,这在尝试冻结它们时可能会有问题。

幸运的是,它们毕竟是对象,你可以很容易地覆盖这些方法以防止它们被使用。

冻结一个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 } / ```