冻结 JS 对象方法

文章类型:Javascript

发布者:hp

发布时间:2025-05-14

一:引言

我们在开发过程中,有时候需要对对象进行不可变性,那么怎么实现呢?

二:目的:

无法增/删/改属性

二:方法

1:浅冻结:Object.freeze() 仅冻结对象的第一层属性

const obj = { a: 1, b: { c: 2 } };
Object.freeze(obj);
obj.b.c = 3;  // 修改成功(未被冻结)‌

2:深冻结:需递归冻结所有层级的对象属性

function deepFreeze(obj) {
  Object.freeze(obj);  // 冻结当前对象
  Object.keys(obj).forEach(key => {
    const value = obj[key];
    if (typeof value === 'object' && value !== null) {
      deepFreeze(value);  // 递归冻结嵌套对象 ‌
    }
  });
  return obj;
}

const obj = { a: 1, b: { c: 2 } };
deepFreeze(obj);
obj.b.c = 3;  // 修改无效 ‌

三:验证

通过Object.isFrozen() 检测对象是否被冻结

console.log(Object.isFrozen(obj));  // true ‌

三:区别

1:Object.freeze()=>适用于简单对象或无需嵌套冻结,仅冻结对象自身属性

2:递归深冻结=>适用于复杂嵌套对象结构,完全冻结对象及嵌套属性