JavaScriptでオブジェクトの拡張を防ぐ`Object.preventExtensions()`メソッドについて、基本的な使い方から実践的な例まで詳しく解説します。

Object.preventExtensions()とは

`Object.preventExtensions()`は、オブジェクトに新しいプロパティを追加できないようにするJavaScriptのメソッドです。既存のプロパティの変更や削除は可能ですが、新しいプロパティの追加のみを制限します。

基本的な使い方

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

Object.preventExtensions(user);

// 新しいプロパティの追加を試みる
user.email = "john@example.com"; // 失敗(strictモードではエラー)
console.log(user.email); // undefined

// 既存のプロパティは変更可能
user.name = "Jane";
console.log(user.name); // "Jane"

拡張可能性の確認方法

オブジェクトが拡張可能かどうかは`Object.isExtensible()`メソッドで確認できます。

const user = {
  name: "John"
};

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

Object.preventExtensions(user);
console.log(Object.isExtensible(user)); // false

preventExtensions()のユースケース

1. 設定オブジェクトの保護

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

Object.preventExtensions(config);
// 設定オブジェクトに新しい項目を追加できなくなる

2. ユーザーデータの制限

const userProfile = {
  id: 1,
  username: "john_doe"
};

Object.preventExtensions(userProfile);
// プロファイルの基本構造を保護

注意点と制限事項

  • ネストされたオブジェクトには影響しない
const nested = {
  user: {
    name: "John"
  }
};

Object.preventExtensions(nested);
nested.user.age = 30; // 可能
  • 配列の長さの変更は制限される
const arr = [1, 2, 3];
Object.preventExtensions(arr);
arr.push(4); // エラー

Object.seal()やObject.freeze()との違い

  • `preventExtensions()`: 新規プロパティの追加のみを防ぐ
  • `seal()`: 新規プロパティの追加と既存プロパティの削除を防ぐ
  • `freeze()`: 新規プロパティの追加、既存プロパティの削除、値の変更を全て防ぐ

まとめ

`Object.preventExtensions()`は、オブジェクトの構造を部分的に固定化したい場合に便利なメソッドです。設定オブジェクトやユーザーデータの保護など、様々なユースケースで活用できます。ただし、完全な不変性が必要な場合は`Object.freeze()`の使用を検討してください。

特定のプロパティの追加のみを制限したい場合や、既存の値は変更可能にしておきたい場合に、`preventExtensions()`は最適な選択肢となります。