7cc@はてなブログ

JavaScriptとかとか

objectの中のobjectを書き換え不可にする

deepFreezedefinePropertyを併用する。

var obj = {
  array: [1,2,3,[4,5]]
}

// definePropertyだけだと **オブジェクトのオブジェクトは変更可能**
Object.defineProperty(obj, "array", {
  writable: false
})
obj.array = "書き換え不可" // TypeError: is read-only
obj.array.push("1") // [1,2,3,[4,5],"1"]

// freeze併用
Object.freeze(obj.array)
obj.array.push(1) // TypeError: is not extensible

// しかしfreezeも**浅い(shallow)**のでまだ中のオブジェクトは変更可能
obj.array[3].push(1,2)
obj.array // [1,2,3,[4,5,1,2],"1"]

=> deepFreeze + defineProperty

deepFreezeはMDNからコピー


deepとshallowにはいつも苦しめられる気がする。