JavaScriptでのオブジェクト凍結・封印・拡張禁止
JavaScriptには、オブジェクトの状態を制御するためのメソッドがいくつか用意されています。これらを使うことで、オブジェクトのプロパティ追加や変更を制限することができます。本記事では、以下のメソッドについて詳しく解説します。
- Object.freeze()
- Object.seal()
- Object.preventExtensions()
- Object.isFrozen()
- Object.isSealed()
- Object.isExtensible()
Object.freeze()
Object.freeze()
はオブジェクトを凍結し、以下の操作を禁止します。
- 新しいプロパティの追加
- 既存プロパティの値の変更
- プロパティの削除
- プロパティの属性(
writable
やconfigurable
)の変更
凍結されたオブジェクトは不変となり、実質的に読み取り専用のオブジェクトとして扱われます。
例:
const obj = { a: 1, b: 2 };
Object.freeze(obj);
obj.a = 10; // 無視される
delete obj.b; // 無視される
obj.c = 3; // 無視される
console.log(obj); // { a: 1, b: 2 }
数学的には、この操作は集合を凍結し、要素の挿入・削除・変更を防ぐ操作に対応します。
状態を確認するには、後述のObject.isFrozen()
を使用します。
Object.seal()
Object.seal()
はオブジェクトを封印します。封印されたオブジェクトでは以下の操作が禁止されます。
- 新しいプロパティの追加
- プロパティの削除
ただし、既存のプロパティ値は変更可能な場合があります。
例:
const obj = { x: 1, y: 2 };
Object.seal(obj);
obj.x = 10; // 変更可能
delete obj.y; // 無視される
obj.z = 3; // 無視される
console.log(obj); // { x: 10, y: 2 }
数学的には、これは集合の要素を固定しつつ、要素の値だけを操作可能にする状態に相当します。
状態を確認するにはObject.isSealed()
を使用します。
Object.preventExtensions()
Object.preventExtensions()
はオブジェクトの拡張を禁止します。これにより、新しいプロパティの追加ができなくなりますが、既存のプロパティの削除や変更は可能です。
例:
const obj = { p: 42 };
Object.preventExtensions(obj);
obj.q = 10; // 無視される
delete obj.p; // 削除可能
obj.p = 50; // 変更可能
console.log(obj); // {} (削除後)
数学的には、集合の新しい要素を追加できないが、既存要素は操作できる状態に対応します。
状態を確認するにはObject.isExtensible()
を使用します。
Object.isFrozen()
Object.isFrozen()
は、オブジェクトが凍結されているかどうかを判定します。
例:
const obj = { a: 1 };
console.log(Object.isFrozen(obj)); // false
Object.freeze(obj);
console.log(Object.isFrozen(obj)); // true
Object.isSealed()
Object.isSealed()
は、オブジェクトが封印されているかどうかを判定します。
例:
const obj = { b: 2 };
console.log(Object.isSealed(obj)); // false
Object.seal(obj);
console.log(Object.isSealed(obj)); // true
Object.isExtensible()
Object.isExtensible()
は、オブジェクトが拡張可能かどうかを判定します。
例:
const obj = { c: 3 };
console.log(Object.isExtensible(obj)); // true
Object.preventExtensions(obj);
console.log(Object.isExtensible(obj)); // false
以上のメソッドを組み合わせることで、JavaScriptオブジェクトの状態を柔軟に管理できます。