JavaScript

Object.isSealed()メソッド

 編集:2022.07.28 by T.A.

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

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

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

解説

オブジェクトが封印されている場合は true が、そうでない場合は false が返ります。オブジェクトが拡張不可かつすべてのプロパティが設定変更不可であり、それゆえ削除できない場合(ただし書き込み不可である必要はありません)場合に、封印されているとなります。

Object.isSealed の使用
// 既定でオブジェクトは封印されていません
var empty = {};
D=Object.isSealed(empty);	// === false

// 空のオブジェクトを拡張不可にすると、
// そのまま封印状態になります
Object.preventExtensions(empty);
D=Object.isSealed(empty);	// === true
// 空でないオブジェクトでは、そのプロパティをすべて設定変更不可にしない限り
// 上記と同じにはなりません
var hasProp = { fee: 'fie foe fum' };
Object.preventExtensions(hasProp);
D=Object.isSealed(hasProp);	// === false

// そこですべてのプロパティを設定変更不可にすると、
// オブジェクトは封印状態になります
Object.defineProperty(hasProp, 'fee', {
  configurable: false
});
D=Object.isSealed(hasProp);	// === true
// オブジェクトを封印する最も簡単な方法は、もちろん Object.seal です
var sealed = {};
Object.seal(sealed);
D=Object.isSealed(sealed);	// === true

// 封印されたオブジェクトはその定義により、拡張できません
D=Object.isExtensible(sealed);	// === false

// 封印されたオブジェクトは凍結されているかも
// しれませんが、必ずしもそうではありません
D=Object.isFrozen(sealed);	// === true。すべてのプロパティが書き込み不能でもあります
var s2 = Object.seal({ p: 3 });
D=Object.isFrozen(s2);	// === false。"p" は依然書き込み可能です
var s3 = Object.seal({ get p() { return 0; } });
D=Object.isFrozen(s3);	// === true。アクセサ プロパティでは設定変更が可能かという事柄だけになります
オブジェクト以外の型強制

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

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

テスト