登录
首页 >  文章 >  前端

Object.freeze与Object.seal区别详解

时间:2026-01-28 20:10:45 474浏览 收藏

你在学习文章相关的知识吗?本文《Object.freeze 与 Object.seal 都用于限制对象的修改,但它们的限制程度不同:Object.freeze 冻结对象后,无法添加、删除或修改属性。属性值如果是对象,内部值仍可被修改(除非也对其冻结)。对象不可扩展(不能添加新属性),不可配置(不能删除已有属性),不可写(不能修改属性值)。Object.seal 封闭对象后,无法添加或删除属性,但可以修改现有属性的值。对象不可扩展,不可配置,但属性值可以更改。适用于需要保留属性结构但允许修改值的场景。总结: freeze 更严格,完全锁定对象。 seal 稍宽松,只防止属性增删,允许修改值。》,主要介绍的内容就涉及到,如果你想提升自己的开发能力,就不要错过这篇文章,大家要知道编程理论基础和实战操作都是不可或缺的哦!

Object.seal禁止增删属性但可修改值,Object.freeze则完全锁定对象;两者均为浅冻结,嵌套对象需递归处理。

JavaScript 的 Object.freeze 与 Object.seal 在限制对象修改时有何不同?

Object.freeze 和 Object.seal 都用于限制对象的修改,但它们的作用程度不同。理解两者的区别有助于在需要控制对象可变性时做出合适选择。

Object.seal:禁止添加或删除属性

调用 Object.seal(obj) 后,对象的属性无法被添加或删除,但已有属性的值仍可修改。属性的描述符(如 writable、configurable)也会受到限制。

  • 不能添加新属性
  • 不能删除已有属性
  • 可以修改已有属性的值(前提是 writable: true)
  • 不能将属性从 configurable 变为不可配置(configurable 会被设为 false)
例如:
const obj = { name: "Alice" };
Object.seal(obj);
obj.name = "Bob";        // ✅ 允许
obj.age = 25;            // ❌ 无效(非严格模式下静默失败)
delete obj.name;         // ❌ 无效

Object.freeze:完全冻结对象

Object.freeze(obj) 比 seal 更严格。它不仅禁止增删属性,还禁止修改任何已有属性的值。

  • 不能添加新属性
  • 不能删除已有属性
  • 不能修改已有属性的值(即使 writable: true,也无法更改)
  • 所有属性变为不可写(writable: false)
例如:
const obj = { name: "Alice" };
Object.freeze(obj);
obj.name = "Bob";        // ❌ 无效(严格模式报错)
obj.age = 25;            // ❌ 无效
delete obj.name;         // ❌ 无效

两者都不处理深层对象

需要注意的是,seal 和 freeze 都是浅操作。如果对象的属性是引用类型(如对象或数组),其嵌套内容仍可能被修改。

const obj = { user: { name: "Alice" } };
Object.freeze(obj);
obj.user.name = "Bob";   // ✅ 成功!内部对象未被冻结

若要彻底冻结,需递归调用 freeze 或使用深冻结工具函数。

基本上就这些。seal 保留属性可写性,freeze 则全面锁定。根据需求选择即可。

理论要掌握,实操不能落!以上关于《Object.freeze与Object.seal区别详解》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

前往漫画官网入口并下载 ➜
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>