#不変オブジェクト
##定義
不変オブジェクトとは精製後に状態が変更されないオブジェクトのことである。
広義には、状態を変更しないオブジェクトを不変オブジェクトと呼ぶ。
狭義には、変更しようにも変更できないオブジェクト、つまり変更禁止のために細工をしたオブジェクトを指します。
##作り方
javascriptオブジェクトを不変オブジェクトにするには次のような手がある。
- プロパティ(状態)を隠し、変更操作を提供しない(jsにはプロパティを隠すために使える技法のひとつにクロージャがある)
- ECMAScript第5版の関数を活用する
- writable属性、configurable属性、セッター、ゲッターを活用する
##関数で不変オブジェクト化
メソッド名 | プロパティ追加 | プロパティ削除 | プロパティ値変更 | 確認メソッド |
---|---|---|---|---|
preventExtensions | x | o | o | Object.isExtensible |
seal | x | x | o | Object.isSealed |
freeze | x | x | x | Object.isFrozen |
内部的に、sealはプロパティのconfigureable属性を偽に、
freezeはwritable属性を偽にしている。
以下のコードのように、
オブジェクト生成時にこれらの属性を明示的に指定することでも同じ効果を得られます。
var x = { x:2, y:3}
var y = Object.create(
Object.prototype,
{
x: {value:2, writable:true, enumerable:true, configurable:true},
y: {value:3, writable:true, enumerable:true, configurable:true}
}
);
#具体例
##Object.preventExtensions
##Object.seal
##Object.freeze
#関数で不変オブジェクト化するときの注意
- 変更すると元に戻せない
- プロトタイプ継承元も不変にしたければ、継承元に対して明示的に行う必要がある
#パーフェクトjavascriptにあった不変オブジェクトに対する「助言」
「不変オブジェクトをあきらめる」
堅牢で安全なプログラムを作るのはコストとのトレードオフ。
安全さのために時間がかかりすぎるかもしれない。
javascriptのようにコードサイズの制約の厳しい環境では堅牢さのために書いたコードが利用者の快適な体験を妨げるかもしれない。
堅牢さとコストのバランスを考えて使うようにすること。