Object.freeze()冻结一个对象有什么意义?

Object.freeze()方法可以冻结一个对象

一个被冻结的对象再也不能被修改

  • 不能添加新属性
  • 不能删除已有属性
  • 不能修改已有属性的可枚举性、可配置性、可写性
  • 不能修改已有属性的值
  • 不能修改原型

 

 

Object.freeze()的意义在哪里?

应该就是跟const常量一样,只不过,const声明简单类型的值不能修改,对象却是可以修改的,所以,如果你想禁止一个对象的修改就可以用Object.freeze()

复制代码
const obj = {
  one: 1
}
obj.one = 2;
console.log(obj.one);

const obj2 = Object.freeze({
  one: 1
})

obj2.one = 2; // 无法修改,报错
复制代码

 

还有一种情况,就是如果这个one是一个对象呢,one依旧可以被修改。

这叫浅冻结

再看一个例子:

const obj1 = {
  internal: {}
}

Object.freeze(obj1);
obj1.internal.a = 'aValue'
console.log(obj1.internal.a); // aValue

 

对于一个常量对象,整个引用图(直接和间接引用其他对象)只能引用不可变的冻结对象。

冻结的对象被认为是不可变的,因为整个对象中的整个对象状态(对其他对象的值和引用)是固定的。

注意,字符串、数字和布尔总是不可变的,而函数和数组是对象。

 

要使对象不可变,需要递归冻结每个类型为对象的属性(深冻结)。

复制代码
function deepFreeze(obj) {
  // 获取定义在obj上的属性名
  var propNames = Object.getOwnPropertyNames(obj);
  // 在冻结自身之前冻结属性
  propNames.forEach(function(name) {
    var prop = obj[name];

    // 如果prop是个对象,冻结它
    if (typeof prop == 'object' && prop !== null)
      deepFreeze(prop);
  });
  return Object.freeze(obj);
}
复制代码

 

 

参考:https://www.mulingyuer.com/archives/362/

posted on   独自去流浪  阅读(5309)  评论(0编辑  收藏  举报

编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示