Object.freeze()注意事项

Object.freeze():运行时的锁

js 复制代码
const config = { apiKey: 'sk-xxxxxx', timeout: 5000 }; 

Object.freeze(config);

config.timeout = 3000;
console.log(config.timeout); // 5000,没变(严格模式会抛 TypeError)

但 freeze 有个暗坑:只锁表面

js 复制代码
const config = { 
    env: 'production', 
    db: { host: '127.0.0.1', port: 3306 } 
}; 

Object.freeze(config); 

config.db.port = 5432; 
console.log(config.db.port); // 5432 ------ 改成功了

config.db引用 被冻住了,但 db 对象本身没有被冻结,内部属性随便改。

所有需要有深层的冻结,只能手写一个方法实现

js 复制代码
function deepFreeze(obj) { 
    Object.getOwnPropertyNames(obj).forEach(key => { const val = obj[key]; 
        if (val && typeof val === 'object') deepFreeze(val);
    }); 
    return Object.freeze(obj); 
} 
deepFreeze(config); 
config.db.port = 5432; // 失效 console.log(config.db.port); // 3306

性能优化点

传入前 Object.freeze(),Vue 会跳过响应式代理,渲染快一截

相关推荐
用户2204603958689 小时前
ES模块和commonJS两种标准下中实现__dirname?一篇文章教你理清楚
前端
犹豫的大炮9 小时前
jQuery最核心的基础设施之一——数据缓存模块进化史
前端·缓存·jquery
小碗细面9 小时前
从 PRD 到上线:SpecKit 如何让 AI 真正参与前端交付
前端·ai编程·claude
WL学习笔记9 小时前
链式队列(数据结构)
前端·数据结构·jquery
我是大卫9 小时前
React源码解析-第三部分:协调与提交
前端·react.js·源码
都想学9 小时前
我把 12 个在线工具关掉了,换成了一个 Chrome 扩展
前端·chrome
xiaogai_gai10 小时前
钉钉数据集成到金蝶云星空案例分享:传给钉钉后,回传金蝶字段
java·前端·钉钉
步步为营DotNet10 小时前
借助 Semantic Kernel 与 Blazor 构建智能交互式前端应用
前端
神奇的代码在哪里10 小时前
AI编程时代,PPT已成为过去,单个HTML文件创造无限可能
javascript·html·powerpoint·ai编程·ppt
Highcharts10 小时前
从 ECharts 平滑迁移 Highcharts的配置映射与踩坑手册
前端·javascript