登录
首页 >  文章 >  前端

Object.freeze与seal区别全解析

时间:2026-05-29 08:31:32 435浏览 收藏

Object.freeze 和 Object.seal 都是 JavaScript 中用于限制对象修改的关键防护机制,但二者在保护强度上存在本质差异:seal 仅禁止增删属性并锁定属性描述符(configurable: false),仍允许修改可写属性的值;而 freeze 在 seal 基础上进一步冻结所有自有属性的值(writable: false),实现更严格的不可变保障;两者均不递归作用于嵌套对象,需手动处理深层冻结;同时,isFrozen 为 true 必然意味着 isSealed 也为 true,但反之不成立——理解这一层次关系,能帮你精准选择适合场景的冻结策略,避免“看似不可变实则可篡改”的陷阱。

JavaScript中Object-freeze与seal对对象的保护差异

Object.freezeObject.seal 都能限制对象的修改,但保护强度不同:freeze 更严格,seal 更宽松。

能否添加或删除属性?

两者都禁止新增和删除属性:

  • Object.seal(obj):把对象设为“密封”,内部将 configurable 设为 false,因此无法 delete 属性,也无法用 Object.defineProperty 改配置(比如变回可删);但已有属性的值仍可改(如果它是 writable)。
  • Object.freeze(obj):在 seal 基础上,进一步把所有自有属性的 writable 设为 false,所以不仅不能增删属性,连基本类型的属性值也不能改。

能否修改属性描述符?

都不能:

  • seal 后,对任意自有属性调用 Object.defineProperty 会抛错(因为 configurable 是 false)。
  • freeze 同样会报错,且即使某个属性原本 writable: true,freeze 后也不允许再设为 writable: true(因为 descriptor 修改本身就被禁了)。

是否影响嵌套对象?

都不递归处理:

  • 如果对象里有子对象,seal 或 freeze 只作用于顶层,子对象依然可自由修改。
  • 需要深层冻结时,得手动递归调用 Object.freeze,或借助工具函数(注意循环引用问题)。

如何检查对象是否被冻结或密封?

可用内置方法判断:

  • Object.isSealed(obj) 返回布尔值,表示是否密封(即 configurable 全为 false,且 extensible 为 false)。
  • Object.isFrozen(obj) 要求更严:extensible 为 false + 所有自有属性的 configurable 和 writable 都为 false。
  • 注意:isFrozen 为 true 必然意味着 isSealed 也为 true,但反过来不成立。

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

资料下载
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>