新闻中心

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

2025-12-15
浏览次数:
返回列表
对象冻结是使J*aScript对象不可修改的最严格防篡改方式,通过Object.freeze()实现浅冻结,需递归处理嵌套对象;另有seal、preventExtensions等防护等级较低的替代方案。

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

对象冻结是指让一个 J*aScript 对象变为不可修改的状态:不能添加、删除或更改其属性,也不能修改属性的描述符(如 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() 不处理深层对象,若要完全冻结整个结构(比如配置对象里有子对象),需要手动递归调用:

立即学习“J*a免费学习笔记(深入)”;

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

简易递归冻结函数示例:

晓象AI资讯阅读神器 晓象AI资讯阅读神器

晓象-AI时代的资讯阅读神器

晓象AI资讯阅读神器 72 查看详情 晓象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() 加上必要递归,已经足够可靠。

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


# 几个  # 高碑店建设网站制作  # 苹果关键词在百度的排名  # 合作网站推广方案  # 小区地推广告营销  # 青岛营销推广服务  # 平阴零食类抖音营销推广  # 跨境网站优化  # 景点的营销推广策略  # 杭州seo工资  # 关键词排名优化4舒心mars软件  # javascript  # 这是  # 如何处理  # 如何使用  # 报错  # 如何防止  # 第一个  # 有哪些  # 已有  # 递归  # java 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: Win11截图该按哪些键 Win11截屏完整流程解析【教程】  J*aScript中针对特定容器内图片动画的实现教程  荣耀Play7T运行卡顿解决_荣耀Play7T性能优化  蛙漫官网漫画入口地址_蛙漫在线畅读无广告弹窗  蛙漫漫画官网在线入口 蛙漫全本漫画免费阅读平台  CSS实现侧边栏导航项全宽圆角悬停背景效果  J*aScript中正确使用querySelectorAll与复杂CSS选择器  c++如何使用TBB库进行任务并行_c++ Intel线程构建模块  ArrayList与LinkedList操作复杂度详解:遍历与修改  Odoo 16:在表单视图中基于当前记录动态修改Tree视图属性  vivo手机参数配置怎么增强信号_vivo手机参数配置信号增强方法  Golang如何实现容器化日志收集与分析_Golang容器日志收集分析方法  快手赚钱渠道_快手收益来源  KFC游戏互动怎么赢取优惠券_KFC线上游戏活动参与与优惠代码赢取教程  msn官网入口地址手机版 msn官方网站手机最新链接  深入理解J*a编译器的兼容性选项:从-source到--release  抖音网页版怎么|直播|_抖音网页版开播操作指南  Archive of Our Own官网直达 AO3最新可用地址一览  J*a如何使用AtomicInteger控制计数_J*a无锁计数器性能分析  Composer如何解决json扩展缺失的错误  html网页设计源代码怎么运行_运行html网页设计源代码步骤【指南】  Windows10怎么开启夜间模式 Windows10系统设置调整色温与亮度缓解夜间用眼疲劳【教程】  composer的"require-dev"部分是用来做什么的?  优化HTML表单样式:解决输入框焦点跳动与元素间距问题  b站赚钱渠道_b站收益来源  如何在 Windows 11 中启动游戏手柄设置  Linux如何排查内存不足OOME问题_LinuxOOM分析教程  C++ typeid如何获取类型信息_C++ RTTI运行时类型识别用法  Lar*el如何生成PDF或Excel文件_Lar*el文档导出工具与使用教程  理解J*aScript Promise的微任务队列与执行顺序  企业名称高精度匹配:N-gram方法在结构相似性分析中的应用  c++中的std::basic_string的SSO优化_c++短字符串优化深度解析  如何使用Go和Martini动态服务解码后的图片  抓大鹅无需下载版 抓大鹅秒玩版入口  从OpenAI API响应中高效提取生成文本  c++项目目录结构应该如何组织_c++工程化项目结构规范  解决移动端滚动问题的overflow属性应用指南  Composer的 "check-platform-reqs" 命令有什么用_在部署前检查生产环境是否满足Composer依赖需求  中兴BladeV30怎样用测距估书架层高_iPhone中兴BladeV30测距估书架层高【家装参考】  Win11怎么安装Linux子系统 Win11 WSL2安装Ubuntu及环境配置指南  Win11怎么用U盘重装系统 Win11制作启动盘并重装系统完整教程【详解】  迅雷下载到U盘速度很慢怎么办_迅雷U盘下载慢优化方法  J*aScript中安全有效地处理localStorage字符串数据  解决Flask中Quill编辑器内容提交失败及TypeError的指南  漫蛙漫画网页端入口 漫蛙2官方正版漫画站点  深入理解Promise链:如何在catch后中断then的执行  怎样使用“本地安全策略”提升Windows安全性_Secpol.msc配置指南【高手】  Excel组合图表怎么做 Excel创建柱状图与折线组合图教程【图表】  yandex入口引擎手机版 yandex安卓版下载入口  word邮件合并后日期格式不对怎么改_Word邮件合并日期格式修改方法 

搜索