定義一個常量,如果這個常量不是對象,那么這個常量是不可以改變的。
例如:
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