对象冻结是使对象不可变的操作,Object.freeze()可防止属性增删改及配置修改,但仅浅层生效;若属性为引用类型,需通过递归实现深度冻结,如封装deepFreeze函数;可用Object.isFrozen()检测是否冻结,适用于配置保护、状态管理等场景。

在JavaScript中,创建不可变对象是保证数据安全和程序稳定的重要手段。其中,Object.freeze() 方法是最常用的方式之一。它能防止对象的属性被修改、添加或删除,从而实现浅层冻结,帮助我们创建不可变对象。
对象冻结是指让一个对象进入一种不可变状态。使用 Object.freeze(obj) 后:
需要注意的是,freeze 是浅冻结,也就是说,如果对象的某个属性是引用类型(如数组或其他对象),其内部仍然可以被修改。
示例:
const user = {
name: 'Alice',
profile: {
age: 25
}
};
Object.freeze(user);
user.name = 'Bob'; // 无效,严格模式下会报错
user.email = 'alice@example.com'; // 添加失败
user.profile.age = 30; // 成功!因为 profile 是对象,未被冻结
console.log(user.profile.age); // 输出:30
为了真正实现不可变对象,需要递归地冻结所有嵌套对象。可以封装一个深度冻结函数:
function deepFreeze(obj) {
// 获取所有属性并遍历
Object.getOwnPropertyNames(obj).forEach(prop => {
const value = obj[prop];
// 如果属性是对象且存在,继续冻结
if (value && typeof value === 'object' && !Object.isFrozen(value)) {
deepFreeze(value);
}
});
return Object.freeze(obj);
}
// 使用示例
const config = {
api: 'https://api.example.com',
headers: {
'Content-Type': 'application/json'
}
};
deepFreeze(config);
config.headers['Authorization'] = 'token'; // 无效
console.log(config.headers.Authorization); // undefined
可以使用 Object.isFrozen() 来判断一个对象是否已被冻结:
console.log(Object.isFrozen(user)); // true(浅冻结)
console.log(Object.isFrozen(config)); // true(深冻结后)
console.log(Object.isFrozen({})); // false
注意:对 null、原始类型调用该方法会直接返回 true,因为它们无法被修改。
基本上就这些。Object.freeze() 是构建健壮应用的有力工具,尤其在强调不可变性的编程模式中非常实用。虽然它只做浅冻结,但通过简单的递归封装就能满足大多数深度不可变需求。关键是理解它的限制,并在必要时手动补全深度控制逻辑。不复杂但容易忽略细节。
以上就是JS对象冻结方法_不可变对象创建的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号