Object.isFrozen()
Baseline Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2015.
Object.isFrozen()
はオブジェクトが凍結されているかどうかを判定します。
試してみましょう
構文
js
Object.isFrozen(obj)
引数
obj
-
確認したいオブジェクトです。
返値
論理値で、与えられたオブジェクトが凍結されているかどうかを示します。
解説
オブジェクトが凍結状態 (frozen) とは、オブジェクトが拡張可能ではなく、すべてのプロパティは構成不可であり、そしてすべてのデータプロパティ(これはゲッターやセッターコンポーネントを持つアクセサープロパティ以外のものを指します)が書き込み不可である場合です。
例
Object.isFrozen の使用
js
// 新しいオブジェクトは拡張可能であるので、凍結されていません
Object.isFrozen({}); // false
// 拡張可能ではない空のオブジェクトは、他に何もしなくても
// 凍結されています
const vacuouslyFrozen = Object.preventExtensions({});
Object.isFrozen(vacuouslyFrozen); // true
// プロパティをひとつ持つ新しいオブジェクトも拡張可能であり、
// それゆえ凍結されていません
const oneProp = { p: 42 };
Object.isFrozen(oneProp); // false
// オブジェクトを拡張不可にしても、それは凍結されません
// なぜなら、まだプロパティが設定変更可能
// (かつ書き込み可能) であるからです
Object.preventExtensions(oneProp);
Object.isFrozen(oneProp); // false
// ...しかしプロパティを削除すると、そのオブジェクトは
// 他に何もしなくても凍結されます
delete oneProp.p;
Object.isFrozen(oneProp); // true
// 書き込み不可であるが設定変更可能なプロパティを持つ、
// 拡張不可のオブジェクトは、凍結されていません
const nonWritable = { e: "plep" };
Object.preventExtensions(nonWritable);
Object.defineProperty(nonWritable, "e", {
writable: false,
}); // 書き込み不可にします
Object.isFrozen(nonWritable); // false
// プロパティを構成不可にすると、
// オブジェクトは凍結されます
Object.defineProperty(nonWritable, "e", {
configurable: false,
}); // 構成不可にします
Object.isFrozen(nonWritable); // true
// 構成不可であるが書き込み可能なプロパティを持つ、
// 拡張不可のオブジェクトは、やはり凍結されていません
const nonConfigurable = { release: "the kraken!" };
Object.preventExtensions(nonConfigurable);
Object.defineProperty(nonConfigurable, "release", {
configurable: false,
});
Object.isFrozen(nonConfigurable); // false
// プロパティを書き込み不可にすると、オブジェクトは
// 凍結されます
Object.defineProperty(nonConfigurable, "release", {
writable: false,
});
Object.isFrozen(nonConfigurable); // true
// 設定変更可能なアクセサープロパティを持つ拡張不可の
// オブジェクトは、凍結されていません
const accessor = {
get food() {
return "yum";
},
};
Object.preventExtensions(accessor);
Object.isFrozen(accessor); // false
// プロパティを構成不可にすると、オブジェクトは凍結されます
Object.defineProperty(accessor, "food", {
configurable: false,
});
Object.isFrozen(accessor); // true
// なお、オブジェクトを凍結するもっとも簡単な方法は、
// Object.freeze を呼び出すことです
const frozen = { 1: 81 };
Object.isFrozen(frozen); // false
Object.freeze(frozen);
Object.isFrozen(frozen); // true
// 定義によると、凍結されたオブジェクトは拡張不可です
Object.isExtensible(frozen); // false
// また、凍結されたオブジェクトは封印されています
Object.isSealed(frozen); // true
オブジェクト以外の型強制
ES5 では、このメソッドの引数がオブジェクトではない場合(プリミティブの場合)、 TypeError
が発生します。 ES2015 以降では、オブジェクトでない引数は、それが凍結された通常のオブジェクトであるかのように扱われ、単に true
を返します。
js
Object.isFrozen(1);
// TypeError: 1 is not an object (ES5 code)
Object.isFrozen(1);
// true (ES2015 code)
仕様書
Specification |
---|
ECMAScript Language Specification # sec-object.isfrozen |
ブラウザーの互換性
BCD tables only load in the browser