JavaScriptでオブジェクトのプロパティを保護する方法として、`Object.seal()`メソッドがあります。このメソッドを使用することで、オブジェクトの既存のプロパティを変更可能なまま保持しつつ、新しいプロパティの追加や既存のプロパティの削除を防ぐことができます。

Object.seal()の基本的な使い方

const user = {
  name: "John",
  age: 30
};

Object.seal(user);

// 既存のプロパティは変更可能
user.name = "Mike"; // OK

// 新しいプロパティの追加は不可
user.email = "test@example.com"; // エラーは発生しないが、追加されない

// プロパティの削除も不可
delete user.age; // エラーは発生しないが、削除されない

console.log(user); // { name: "Mike", age: 30 }

seal()されたオブジェクトの特徴

1. 既存のプロパティ値の変更は可能

2. 新しいプロパティの追加は不可

3. 既存のプロパティの削除は不可

4. プロパティの設定変更は不可

seal()の状態を確認する方法

オブジェクトがseal()されているかどうかは、`Object.isSealed()`メソッドで確認できます。

const user = {
  name: "John"
};

console.log(Object.isSealed(user)); // false

Object.seal(user);

console.log(Object.isSealed(user)); // true

freeze()との違い

`Object.freeze()`と`Object.seal()`は似ているようで異なる機能です。

  • `Object.seal()`: プロパティの値の変更は可能
  • `Object.freeze()`: プロパティの値の変更も不可
const user1 = {
  name: "John"
};

const user2 = {
  name: "Mike"
};

Object.seal(user1);
Object.freeze(user2);

user1.name = "Alice"; // OK
user2.name = "Bob";   // エラー(strictモード)または変更されない

実践的な使用例

const config = {
  apiKey: "abc123",
  endpoint: "https://api.example.com"
};

// 設定オブジェクトを保護
Object.seal(config);

// アプリケーション内で設定値の変更は可能
config.apiKey = "xyz789"; // OK

// 新しい設定の追加は防止
config.timeout = 5000; // 追加されない

注意点

1. seal()は浅い(shallow)保護のみを提供します。ネストされたオブジェクトは保護されません。

const user = {
  name: "John",
  settings: {
    theme: "dark"
  }
};

Object.seal(user);

// ネストされたオブジェクトのプロパティは変更可能
user.settings.theme = "light"; // OK

2. strictモードでない場合、エラーは発生せず、操作が静かに失敗します。

まとめ

`Object.seal()`は、オブジェクトの構造を固定しながら値の更新を許可したい場合に適しています。設定オブジェクトやAPIのインターフェース定義など、プロパティの追加や削除を防ぎたい場合に特に有用です。完全な不変性が必要な場合は代わりに`Object.freeze()`を使用することを検討してください。