カテゴリー別アーカイブ: ECMAScript the 5th Edition

JavaScript Object.freezeの注意点

ECMAScript第5版で定義されたObjectのfreezeクラスメソッド.

不変オブジェクトを作成するためのメソッドだけども,

1つ落とし穴があるということを知った.

それは…, 再帰的には適用されないということ.

つまり, 以下のような場合は, 中身が変更できてしまう.

var recursiveObject = {
    a : 0,
     b : 'hoge',
     c : ['a', 'b', 'c'],
     d ] {a : 1, b : 2, c : 3}
};

この場合, Object.freezeを適用しても, 参照で配列や内側のオブジェクトを変更できてしまう.

Object.freezeの再帰処理は自前で実装するしかない.

JavaScript 不変オブジェクト

ECMAScript 第5版のObjectクラスで定義されているクラスメソッドを利用することで不変オブジェクトを作成可能.

メソッド 制限レベル 確認メソッド
Object.preventExtensions プロパティの追加を禁止する Object.isExtensible (追加可能ならtrue)
Object.seal プロパティの追加・削除を禁止する Object.isSealed
Object.freeze プロパティの追加・削除・更新を禁止する Object.isFrozen

 

これらのメソッドで注意したいことは, 1度設定するとそれ以降は変更できないことです. (考えてみれば当然で, 変更可能ならそもそも意味がない…).

また, 不変オブジェクトの作成はこれらのメソッドを利用する以外にも, Object.createメソッドの第2引数にプロパティディスクリプタを指定したり, Object.defineProperty / Object.definePropertiesメソッドでプロパティディスクリプタを設定したりすることでも作成できます.

これらのメソッドとプロパティディスクリプタに関してはまた紹介したいと思います.