JavaScriptでfinally(不変)なオブジェクトの定義方法についてまとめました。
目次
finally(不変)なオブジェクトとは
オブジェクトのプロパティの追加や削除、またプロパティの値の変更が出来ない(エラーになる)オブジェクトのことです。
オブジェクトのプロパティを動的に追加・削除できることは柔軟性があって良い面もありますが、勝手にプロパティを追加・削除されたくない時もあります。
そんな時は、不変オブジェクトにすることにより予想外の変更を防止することが出来ます。
3種類の不変オブジェクト
不変オブジェクトの定義には、preventExtensions、seal、freeze のメソッドが使用できます。
それぞれのメソッドで、プロパティの追加・削除・変更の制限が異なります。
preventExtensions(追:× 削:○ 変:○)
プロパティの追加のみ不可になります。
ん〜しっくりくる使い方が思い浮かびません。
1 2 3 4 5 6 7 |
'use strict'; var latlon = { lat: 40, lon: 140 }; Object.preventExtensions(latlon); latlon.aaa = "b"; // プロパティの追加は不可 |
seal(追:× 削:× 変:○)
プロパティ値の変更のみ可能になります。
オブジェクトのプロパティは固定で、値のみ変更できるので、”クラスのインスタンス生成後にプロパティの追加・削除をさせない” というような使い道があります。
1 2 3 4 5 6 7 8 |
'use strict'; var latlon = { lat: 40, lon: 140 }; Object.seal(latlon); latlon.aaa = "b"; // プロパティ追加:不可 delete latlon.lat; // プロパティ削除:不可 |
freeze(追:× 削:× 変:×)
指定したオブジェクトのプロパティ操作を全て不可にします。
オブジェクトを定数として扱いたい場合などに使用できます。
1 2 3 4 5 6 7 8 9 |
'use strict'; var latlon = { lat: 40, lon: 140 }; Object.freeze(latlon); latlon.aaa = "b"; // プロパティ追加:不可 delete latlon.lat; // プロパティ削除:不可 latlon.lat = "41"; // プロパティ変更:不可 |