不変クラス(不変オブジェクト)

javascript

概要

前回の投稿でオブジェクトのプロパティ列挙不可をとりあげましたが、
今回は別な方法でオブジェクトを不変にする方法を試してみます。

具体的にはObject.freeze()というメソッドを使います。
これはオブジェクトを凍結し、プロパティの追加や削除の可否を決めることができます。

サンプル

下記のサンプルコードを書いてみます。
(値を確認する為のログ出力を多くいれています)

let obj = {a: 10};

console.log(obj);

//試験的に他の値を代入する
obj.a = 20;

console.log(obj);

//オブジェクトをfreezeする
Object.freeze(obj);

console.log(obj);

//試験的に他の値を代入する
obj.a = 30;

console.log(obj);

出力結果は下記のようになります。

Object { a: 10 }
Object { a: 20 }
Object { a: 20 }
Object { a: 20 }

このfreezeメソッドはプロパティを凍結する為、書き込み可否はfalseになります。
また、セッターおよびゲッターのアクセサープロパティは使用可能です。

その他、類似するメソッドについて

Object.freeze()と同様の動作するメソッドとして以下のものがあります。

Object.seal()
Object.preventExtensions()

sealはオブジェクトにプロパティの追加や削除ができず、値の変更のみ可能です。
preventExtensionsはプロパティ追加ができません。

また、freeze()メソッドはオブジェクトを「不変」にするので、解凍するという命令はなく、一度メソッドを使うとそのプログラム内では状態が凍結されたままになります。

どうしてもプロパティの内容を変更したい場合は、オブジェクトをコピーし、コピーしたオブジェクトに対してプロパティを付与する方法もありますが、strictモードではオブジェクトをコピーしたタイミングでエラーになります。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です