Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
- トップページ
- JavaScript辞典
- Object.freeze() / seal()
Object.freeze() / seal()対応: ES5(ECMAScript 2009)
オブジェクトのプロパティの変更を禁止します。『Object.freeze()』は完全に凍結し、『Object.seal()』は値の変更のみ許可します。
構文
// オブジェクトを凍結します。プロパティの追加・削除・変更がすべて禁止されます。 Object.freeze(オブジェクト) // オブジェクトを封印します。プロパティの追加・削除は禁止されますが、値の変更は可能です。 Object.seal(オブジェクト) // 凍結されているかを判定します。 Object.isFrozen(オブジェクト) // 封印されているかを判定します。 Object.isSealed(オブジェクト)
メソッド一覧
| メソッド | 概要 |
|---|---|
| Object.freeze(オブジェクト) | オブジェクトを凍結し、プロパティの追加・削除・値の変更をすべて禁止します。凍結されたオブジェクトを返します。 |
| Object.seal(オブジェクト) | オブジェクトを封印し、プロパティの追加・削除を禁止します。既存プロパティの値の変更は可能です。 |
| Object.isFrozen(オブジェクト) | オブジェクトが凍結されていれば『true』、そうでなければ『false』を返します。 |
| Object.isSealed(オブジェクト) | オブジェクトが封印されていれば『true』、そうでなければ『false』を返します。 |
サンプルコード
// Object.freeze でオブジェクトを凍結します。
var config = { apiUrl: "https://api.example.com", timeout: 3000 };
Object.freeze(config);
config.timeout = 5000; // 変更は無視されます。
config.retryCount = 3; // 追加も無視されます。
delete config.apiUrl; // 削除も無視されます。
console.log(config.timeout); // 『3000』のまま出力されます。
console.log(config.retryCount); // 『undefined』と出力されます。
// Object.seal でオブジェクトを封印します。
var settings = { theme: "dark", lang: "ja" };
Object.seal(settings);
settings.theme = "light"; // 値の変更は可能です。
settings.fontSize = 14; // 追加は無視されます。
delete settings.lang; // 削除も無視されます。
console.log(settings.theme); // 『light』と出力されます。
console.log(settings.fontSize); // 『undefined』と出力されます。
// 凍結・封印の判定
console.log(Object.isFrozen(config)); // 『true』と出力されます。
console.log(Object.isSealed(config)); // 凍結されたオブジェクトは封印もされているため『true』と出力されます。
console.log(Object.isSealed(settings)); // 『true』と出力されます。
console.log(Object.isFrozen(settings)); // 『false』と出力されます。
実行結果
上記のコードを実行すると、コンソールには以下が出力されます。
3000 // freeze により変更が無視された undefined // freeze により追加が無視された "light" // seal では値の変更は可能 undefined // seal により追加が無視された true // config は凍結されている true // 凍結は封印を含む true // settings は封印されている false // settings は凍結されていない
freeze と seal の違い
| 操作 | Object.freeze() | Object.seal() |
|---|---|---|
| プロパティの追加 | できません。 | できません。 |
| プロパティの削除 | できません。 | できません。 |
| 値の変更 | できません。 | できます。 |
概要
『Object.freeze()』と『Object.seal()』はオブジェクトの変更を制限するメソッドです。『Object.freeze()』はプロパティの追加・削除・値の変更をすべて禁止する最も厳しい制限で、『Object.seal()』はプロパティの追加・削除のみを禁止し、値の変更は許可します。
注意点として、どちらのメソッドも浅い制限です。ネストされたオブジェクトの中身までは凍結・封印されないため、内側のオブジェクトのプロパティは変更できてしまいます。ネストされたオブジェクトも含めて完全に凍結したい場合は、再帰的に『Object.freeze()』を適用する必要があります。
変更を試みてもエラーは発生せず、単に無視されます。ただし strict モード( "use strict" )では TypeError が発生するため、意図しない変更を検出しやすくなります。設定値や定数オブジェクトなど、プログラムの実行中に変更されてはいけないデータに対して使用すると効果的です。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。