導入
JavaScriptで開発をしていると、「特定のオブジェクトにこれ以上プロパティを追加させたくない」という場面に出くわすことがあります。不用意なプロパティの追加は、予期せぬバグの温床になりがちです。そんな時、オブジェクトの拡張を物理的に制限してくれるのが Object.preventExtensions です。このメソッドを使いこなすことで、オブジェクトの構造を堅牢に保ち、意図しないデータ汚染を防ぐことができます。
基礎知識
Object.preventExtensions は、引数に渡したオブジェクトに対して「新しいプロパティの追加」を禁止するメソッドです。
重要なポイントとして、このメソッドは以下の挙動をとります。
・既存のプロパティを「削除」することは可能です。
・既存のプロパティの「値」を変更することも可能です。
・あくまで「新しいプロパティの追加」のみが禁止されます。
また、Object.isExtensible メソッドを使うことで、そのオブジェクトが現在拡張可能かどうかを確認することができます。
実装/解決策
手順は非常にシンプルで、対象のオブジェクトを Object.preventExtensions に渡すだけです。一度拡張を禁止すると、元の状態に戻すことはできないため注意が必要です。
サンプルプログラム
以下のコードを実行して、実際にプロパティの追加が拒否される様子を確認してみてください。
// 拡張可能なオブジェクトを作成
const user = { name: "田中" };
// 拡張を禁止する
Object.preventExtensions(user);
// 拡張可能か確認
console.log(Object.isExtensible(user)); // 結果: false
// 新しいプロパティを追加しようと試みる
user.age = 25;
// 追加されているか確認
console.log(user.age); // 結果: undefined (追加が無視される)
// 既存プロパティの変更は可能
user.name = "佐藤";
console.log(user.name); // 結果: "佐藤"
// 既存プロパティの削除も可能
delete user.name;
console.log(user); // 結果: {}
応用・注意点
現場で使う際に注意すべき点が2つあります。
1. Strictモード(use strict)の影響
通常のモードでは、禁止されたプロパティを追加しようとしても単に無視されますが、Strictモードで実行した場合は TypeError がスローされます。安全性を高めるためにも、本番環境ではStrictモードを有効にすることを推奨します。
2. Object.sealやObject.freezeとの違い
・Object.preventExtensions: 追加のみ禁止(削除・変更は可能)。
・Object.seal: 追加と削除を禁止(変更は可能)。
・Object.freeze: 追加・削除・変更すべてを禁止。
要件に合わせて、どのレベルまで制限をかけるべきか使い分けることが、フロントエンド・スペシャリストとしての重要なスキルです。堅牢なアプリケーション設計を目指しましょう。