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)); // true

3. 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のオブジェクトを効果的に保護し、予期しない変更を防ぐことができます。