JavaScriptでオブジェクトのプロパティを変更不可能にしたい場合、`Object.freeze()`メソッドを使用します。このメソッドを使うことで、オブジェクトを「凍結」し、その内容を保護することができます。
Object.freeze()の基本的な使い方
const user = {
name: "John",
age: 30
};
Object.freeze(user);
// 変更を試みる
user.name = "Mike"; // 変更されない
user.age = 31; // 変更されないfreeze()メソッドを適用すると、以下の操作が禁止されます:
- プロパティの値の変更
- 新しいプロパティの追加
- 既存のプロパティの削除
- プロパティの設定の変更
freeze()の特徴と注意点
1. ネストされたオブジェクト
freeze()は「シャローフリーズ」を行います。つまり、ネストされたオブジェクトは保護されません。
const user = {
name: "John",
address: {
city: "Tokyo",
country: "Japan"
}
};
Object.freeze(user);
// メインオブジェクトは変更不可
user.name = "Mike"; // 変更されない
// ネストされたオブジェクトは変更可能
user.address.city = "Osaka"; // 変更される!2. 凍結状態の確認
オブジェクトが凍結されているかどうかは`Object.isFrozen()`で確認できます:
const user = {
name: "John"
};
console.log(Object.isFrozen(user)); // false
Object.freeze(user);
console.log(Object.isFrozen(user)); // true3. strictモードでの挙動
strictモードでは、凍結されたオブジェクトを変更しようとするとエラーが発生します:
"use strict";
const user = {
name: "John"
};
Object.freeze(user);
// TypeError: Cannot assign to read only property 'name'
user.name = "Mike";実践的な使用例
1. 定数オブジェクトの作成
const CONFIG = Object.freeze({
API_KEY: "abc123",
BASE_URL: "https://api.example.com",
TIMEOUT: 5000
});2. イミュータブルなデータ構造の実現
const permissions = Object.freeze({
READ: "read",
WRITE: "write",
EXECUTE: "execute"
});まとめ
Object.freeze()は以下の場合に特に有用です:
- 設定オブジェクトの保護
- 定数の定義
- イミュータブルなデータ構造の作成
- セキュリティ要件の実装
ただし、ネストされたオブジェクトの保護が必要な場合は、ディープフリーズを実装するか、別のアプローチを検討する必要があります。
freeze()メソッドを使用することで、JavaScriptのオブジェクトを効果的に保護し、予期しない変更を防ぐことができます。