objectの中のobjectを書き換え不可にする
deepFreeze
とdefineProperty
を併用する。
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
deepとshallowにはいつも苦しめられる気がする。