首页 > web前端 > js教程 > 正文

什么是对象冻结_javascript中如何防止对象被修改?

幻影之瞳
发布: 2025-12-15 15:37:56
原创
907人浏览过
对象冻结是使JavaScript对象不可修改的最严格防篡改方式,通过Object.freeze()实现浅冻结,需递归处理嵌套对象;另有seal、preventExtensions等防护等级较低的替代方案。

什么是对象冻结_javascript中如何防止对象被修改?

对象冻结是指让一个 JavaScript 对象变为不可修改的状态:不能添加、删除或更改其属性,也不能修改属性的描述符(如 writableconfigurableenumerable)。这是最严格的防篡改方式之一,常用于确保关键配置、常量或共享数据不被意外改动。

使用 Object.freeze() 冻结对象

Object.freeze() 是最常用的方法,它会直接冻结传入的对象,并返回该对象(原地修改,不创建新对象)。

  • 冻结后,尝试修改已有属性值(如 obj.name = "new")在严格模式下会报错,在非严格模式下静默失败
  • 无法添加新属性、删除已有属性、重定义属性描述符
  • 注意:它只做浅冻结 —— 如果属性值是对象,那个嵌套对象本身不会被冻结

示例:

const config = { api: "https://api.example.com", timeout: 5000 };
Object.freeze(config);
config.timeout = 10000; // 无效(非严格模式)或报错(严格模式)
config.version = "1.0"; // 添加失败

冻结嵌套对象需递归处理

因为 Object.freeze() 不处理深层对象,若要完全冻结整个结构(比如配置对象里有子对象),需要手动递归调用:

立即学习Java免费学习笔记(深入)”;

  • 先检查属性是否为纯对象且未冻结,再对其调用 Object.freeze()
  • 跳过 null、原始类型(string/number/boolean)、函数、Date、RegExp 等非普通对象
  • 避免循环引用导致死循环(实际项目中建议加缓存判断)

简易递归冻结函数示例:

Kreado AI
Kreado AI

Kreado AI是一个多语言AI视频创作平台,只需输入文本或关键词,即可创作真实/虚拟人物的多语言口播视频。 为创作者提供AI赋能

Kreado AI 182
查看详情 Kreado AI
function deepFreeze(obj) {
  if (obj && typeof obj === "object" && !Object.isFrozen(obj)) {
    Object.getOwnPropertyNames(obj).forEach(prop => {
      if (obj[prop] !== null && typeof obj[prop] === "object") {
        deepFreeze(obj[prop]);
      }
    });
    return Object.freeze(obj);
  }
  return obj;
}

其他防修改方法对比

根据需求强度不同,还有几个相关 API 可选:

  • Object.seal():禁止添加/删除属性,但允许修改已有属性值(writable: true 的属性仍可改)
  • Object.preventExtensions():只禁止添加新属性,其余都允许
  • Object.defineProperty():可单独设置某个属性为只读(writable: false)或不可配置(configurable: false

三者防护等级:freeze > seal > preventExtensions。一般优先用 freeze,除非你明确需要保留某些修改能力。

冻结后如何检测?

可以用 Object.isFrozen(obj) 判断对象是否已被冻结。注意它只检查对象自身,不检查嵌套对象 —— 所以对深冻结对象,这个方法返回 false,除非你已递归冻结所有层级。

基本上就这些。冻结不是万能的(比如不能阻止原型链污染或 Symbol 属性误操作),但在大多数业务场景下,Object.freeze() 加上必要递归,已经足够可靠。

以上就是什么是对象冻结_javascript中如何防止对象被修改?的详细内容,更多请关注php中文网其它相关文章!

java速学教程(入门到精通)
java速学教程(入门到精通)

java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号