→
オブジェクトが凍結されているかどうかを判定します。
obj | 確認したいオブジェクトです。 |
---|
与えられたオブジェクトが凍結されているかどうかを示す Boolean。
オブジェクトが拡張可能ではなく、すべてのプロパティは設定変更不可であり、そしてすべてのデータ プロパティ(これはゲッターやセッター コンポーネントを持つアクセサー プロパティではないものを指します)が書き込み不可である場合に、凍結されているとなります。
// 新しいオブジェクトは拡張可能であるので、凍結されていません 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)