Skip to content

如何冻结一个 JS 对象?

Posted on:2024年9月2日 at 01:14

可以使用 Object.freeze() 方法冻结一个 JavaScript 对象。

冻结对象会阻止对对象的修改,包括添加新属性、删除现有属性以及修改现有属性的值。

使用 Object.freeze()

// 创建一个对象
const person = {
  name: "Alice",
  age: 25,
};

// 冻结对象
Object.freeze(person);

// 尝试修改对象的属性
person.name = "Bob"; // 不会改变,因为对象已被冻结
person.gender = "female"; // 不会添加,因为对象已被冻结
delete person.age; // 不会删除属性,因为对象已被冻结

console.log(person); // 输出: { name: 'Alice', age: 25 }

Object.freeze() 方法的特性

  1. 不可变性

    • 对象被冻结后,现有的属性变得不可修改。
    • 新属性不能被添加。
    • 现有属性不能被删除。
  2. 嵌套对象

    • Object.freeze() 只会冻结对象的第一层。嵌套的对象属性不会被递归冻结。
    const person = {
      name: "Alice",
      address: {
        city: "Wonderland",
      },
    };
    
    Object.freeze(person);
    
    // 修改嵌套对象的属性不会被阻止
    person.address.city = "New Wonderland";
    console.log(person.address.city); // 输出: 'New Wonderland'
    

深度冻结

要完全冻结对象及其所有嵌套属性,可以编写一个递归函数来实现深度冻结:

function deepFreeze(obj) {
  // 获取对象的所有属性名
  const propNames = Object.getOwnPropertyNames(obj);

  // 遍历所有属性
  propNames.forEach((name) => {
    const value = obj[name];

    // 如果属性值是对象,则递归冻结
    if (typeof value === "object" && value !== null) {
      deepFreeze(value);
    }
  });

  // 冻结对象本身
  return Object.freeze(obj);
}

const person = {
  name: "Alice",
  address: {
    city: "Wonderland",
  },
};

deepFreeze(person);

// 尝试修改嵌套对象的属性
person.address.city = "New Wonderland"; // 不会改变,因为对象及其嵌套对象已被冻结

console.log(person.address.city); // 输出: 'Wonderland'
原文转自:https://fe.ecool.fun/topic/212e760b-fb9a-4dc6-9175-c2053e96cd16