JavaScript

Object.isFrozen()メソッド

 編集:2022.07.28 by T.A.

オブジェクトが凍結されているかどうかを判定します。

Object.isFrozen(obj)
obj 確認したいオブジェクトです。
戻り値

与えられたオブジェクトが凍結されているかどうかを示す Boolean。

解説

オブジェクトが拡張可能ではなく、すべてのプロパティは設定変更不可であり、そしてすべてのデータ プロパティ(これはゲッターやセッター コンポーネントを持つアクセサー プロパティではないものを指します)が書き込み不可である場合に、凍結されているとなります。

Object.isFrozen の使用
// 新しいオブジェクトは拡張可能であるので、凍結されていません
D=Object.isFrozen({});	// === false

// 拡張可能ではない空のオブジェクトは、他に何もしなくても
// 凍結されています
var vacuouslyFrozen = Object.preventExtensions({});
D=Object.isFrozen(vacuouslyFrozen);	// === true

プロパティをひとつ持つ新しいオブジェクトも拡張可能であり、それゆえ凍結されていません:

var oneProp = { p: 42 };
D=Object.isFrozen(oneProp);	// === false

// オブジェクトを拡張不可にしても、それは凍結されません
// なぜなら、まだプロパティが設定変更可能
// (かつ書き込み可能) であるからです
Object.preventExtensions(oneProp);
D=Object.isFrozen(oneProp);	// === false

// ...しかしプロパティを削除すると、そのオブジェクトは
// 他に何もしなくても凍結されます
delete oneProp.p;
D=Object.isFrozen(oneProp);	// === true
書き込み不可であるが設定変更可能なプロパティを持つ、拡張不可のオブジェクトは、凍結されていません:
 
var nonWritable = { e: 'plep' };
Object.preventExtensions(nonWritable);
Object.defineProperty(nonWritable, 'e', {
  writable: false
});	// 書き込み不可にします
D=Object.isFrozen(nonWritable);	// === false

// プロパティを設定変更不可にすると、
// オブジェクトは凍結されます
Object.defineProperty(nonWritable, 'e', {
  configurable: false
});	// 設定変更不可にします
D=Object.isFrozen(nonWritable);	// === true

設定変更不可であるが書き込み可能なプロパティを持つ、拡張不可のオブジェクトは、やはり凍結されていません:

var nonConfigurable = { release: 'the kraken!' };
Object.preventExtensions(nonConfigurable);
Object.defineProperty(nonConfigurable, 'release', {
  configurable: false
});
D=Object.isFrozen(nonConfigurable);	// === false

// プロパティを書き込み不可にすると、オブジェクトは
// 凍結されます
Object.defineProperty(nonConfigurable, 'release', {
  writable: false
});
D=Object.isFrozen(nonConfigurable);	// === true

設定変更可能なアクセサープロパティを持つ拡張不可のオブジェクトは、凍結されていません:

var accessor = { get food() { return 'yum'; } };
Object.preventExtensions(accessor);
D=Object.isFrozen(accessor);	// === false

// ...しかしプロパティを設定変更不可にすると、
// オブジェクトは凍結されます
Object.defineProperty(accessor, 'food', {
  configurable: false
});
D=Object.isFrozen(accessor);	// === true

なお、オブジェクトを凍結するもっとも簡単な方法は、Object.freeze を呼び出すことです:

var frozen = { 1: 81 };
D=Object.isFrozen(frozen);	// === false
Object.freeze(frozen);
D=Object.isFrozen(frozen);	// === true

// 定義によると、凍結されたオブジェクトは拡張不可です
D=Object.isExtensible(frozen);	// === false

// また、凍結されたオブジェクトは封印されています
D=Object.isSealed(frozen);	// === true
オブジェクト以外の型強制

ES5 では、このメソッドの引数がオブジェクトではない場合(プリミティブの場合)、TypeError が発生します。ES2015 以降では、オブジェクトでない引数は、それが凍結された通常のオブジェクトであるかのように扱われ、単に true を返します。

D=Object.isFrozen(1);	// TypeError: 1 is not an object(ES5 code)
Object.isFrozen(1);	//=true。(ES2015 code)

テスト