js冻结对象

Posted on 2020-03-07 16:54  猫头唔食鱼  阅读(1556)  评论(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