定义一个常量,如果这个常量不是对象,那么这个常量是不可以改变的。
例如:
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