言語
日本語
English

Caution

お使いのブラウザはJavaScriptが無効になっております。
当サイトでは検索などの処理にJavaScriptを使用しています。
より快適にご利用頂くため、JavaScriptを有効にしたうえで当サイトを閲覧することをお勧めいたします。

JavaScript辞典

  1. トップページ
  2. JavaScript辞典
  3. 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』と出力されます。

freeze と seal の違い

操作Object.freeze()Object.seal()
プロパティの追加できません。できません。
プロパティの削除できません。できません。
値の変更できません。できます。

概要

『Object.freeze()』と『Object.seal()』はオブジェクトの変更を制限するメソッドです。『Object.freeze()』はプロパティの追加・削除・値の変更をすべて禁止する最も厳しい制限で、『Object.seal()』はプロパティの追加・削除のみを禁止し、値の変更は許可します。

注意点として、どちらのメソッドも浅い制限です。ネストされたオブジェクトの中身までは凍結・封印されないため、内側のオブジェクトのプロパティは変更できてしまいます。ネストされたオブジェクトも含めて完全に凍結したい場合は、再帰的に『Object.freeze()』を適用する必要があります。

変更を試みてもエラーは発生せず、単に無視されます。ただし strict モード( "use strict" )では TypeError が発生するため、意図しない変更を検出しやすくなります。設定値や定数オブジェクトなど、プログラムの実行中に変更されてはいけないデータに対して使用すると効果的です。

対応ブラウザ

Chrome Chrome
49 以降
5 以前 ×
Firefox Firefox
57 以降
3.5 以前 ×
Safari Safari
18 以降
5 以前 ×
Edge Edge
80 以降
11 以前 ×
IE IE
11 以降
8 以前 ×
Opera Opera
48 以降
11 以前 ×
iOS Safari iOS Safari
18 以降
4 以前 ×
Android Browser Android Browser
37 以降
4 以前 ×
Chrome Android Chrome Android
36 以降
17 以前 ×
Firefox Android Firefox Android
79 以降
3 以前 ×

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。