如何在 JavaScript 中使用 Object.freeze()

2025-06-04

如何在 JavaScript 中使用 Object.freeze()

在 JavaScript 中,对象和数组是可变的,而原始值则不可变。这意味着我们可以随时更改对象(或数组)。但是,如果出于某种原因,我们想阻止这种情况发生,并使对象不可变,该怎么办?

实现这一目标的一种方法是使用该freeze()方法。

冻结的对象无法再被修改;冻结对象会阻止为其添加新属性、删除现有属性、更改现有属性的可枚举性、可配置性或可写性,以及阻止更改现有属性的值。此外,冻结对象还会阻止其原型被修改。freeze() 返回传入的对象。

一些说明此方法用法的代码如下所示:

const objectExample = {
  prop1: 42,
  prop2: "Jack"
};

// by default, we can modify the object's properties as we want
objectExample.prop1 = 100;
console.log(objectExample.prop1) // prints 100

// now let's freeze the object
Object.freeze(objectExample);

objectExample.prop2 = "Alice" // will throw an error in strict mode but fail silently in non-strict mode

console.log(objectExample.prop2); // prints "Jack", since we couldn't change the value of the prop
Enter fullscreen mode Exit fullscreen mode

需要记住的是,如果frozen对象具有以对象为值的属性,则除非我们也冻结它们,否则这些对象是可以更改的。这意味着我们只实现了shallow freeze。要通过冻结对象的所有属性(包括将其他对象存储为值的属性)来使对象不可变,我们必须执行deep freeze—— 即在冻结父对象之前先冻结子对象,使用recursion

以下函数仅供参考。您可以随意命名。将对象冻结为属性值时请务必小心,以免冻结不应变为不可变的内容。

const theObject = {
  x: 1,
  z: 2,
  y: {
    a: "Hello",
    b: "World"
  }
}

const deepFreeze = (obj) => {

  const propNames = Object.getOwnPropertyNames(obj)

  for (const name of propNames) {
    const value = obj[name];

    if (value && typeof value === "object") { 
      deepFreeze(value);
    }
  }

  return Object.freeze(obj);
}

deepFreeze(theObject);
theObject.y.a = 456; // the value can't be changed
console.log(theObject.y.a ); // Hello
Enter fullscreen mode Exit fullscreen mode

图片来源:Caspar Camille Rubin/Unsplash 上的 @casparrubin

文章来源:https://dev.to/arikaturika/how-to-use-object-freeze-in-javascript-3e8l
PREV
Web 浏览器的工作原理 - 解析 HTML(第 3 部分,附插图)📜🔥
NEXT
网络无障碍——ARIA 简介