js冻结对象

Posted on   猫头唔食鱼  阅读(1558)  评论(0编辑  收藏  举报

定义一个常量,如果这个常量不是对象,那么这个常量是不可以改变的。

例如:

const  PI = 3.14
PI = 3  // 报错

但是如果这个常量是个对象,那么,这个常量的属性还是可以被修改和删除的,也可以往这个对象里添加新属性。

例如:

const obj = {
    a:'a',
    b:'b'
    }

obj.a = c 
console.log(obj.a)   // c

那么应该怎样才能防止一个常量的对象被修改了呢?此时需要一个方法

Object.freeze(obj)

被冻结的对象,不能添加属性,不能修改属性,不能删除属性,例如:

复制代码
var obj = {
   a:'a',
   b:'b'  
}

Object.freeze(obj)

obj.a = 'c'
console.log(obj.a)  // 仍然是 a,不是 c
复制代码

如何判断一个对象是否被冻结?那需要另外一个方法:

Object.isFrozen(obj)

例如:

var obj = {
   a:'a',
   b:'b'  
}

Object.freeze(obj)

Object.isFrozen(obj)  // true

 

如何冻结深层对象?

深层对象是这样的:

const deepObj = {
   test:{
       a:'a',
       b:'b'        
    }  
}

js没有冻结深层对象的方法,但是可以自己写一个。

复制代码
  function deepFreeze(obj){
            var propertyNames = Object.getOwnPropertyNames(obj)
            propertyNames.forEach(ele=>{
                if(typeof obj[ele] === 'object' && obj[ele]!==null){
                    deepFreeze(obj[ele])
                }
            })
            return Object.freeze(obj)
         }


deepFreeze(deepObj)
Object.isFrzon(deepObj)  // true
复制代码

 

编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示