オブジェクトとキーの特性設定
オブジェクトの特性設定
オブジェクト自体に特性を設定します。
値を変更できなくしたり、キーを削除できなくしたり、キーを追加できなくすることができます
Object.関数名(対象オブジェクト);
関数名 | freeze() | seal() | preventExtensions() |
---|---|---|---|
値の変更 | × | ○ | ○ |
キー削除 | × | × | ○ |
キー追加 | × | × | × |
確認関数 | isFrozen() | isSealed() | isExtensible() |
freeze() の使用例 var o = { a: 1 }; //初期特性は「値の変更」「キー削除」「キー追加」全て可 Object.freeze(o); //凍結完了 Object.isFrozen(o); //true o.a = 2; //値を変更できません o.b = 3; //キーを追加できません delete o.a //キーを削除できません //これらのエラーは暗黙的にスキップされます
freeze() してもオブジェクト自体には代入できてしまいます。
それを防ぐにはES6の const を利用するしかありません。 const o = Object.freeze({});
ここで紹介した関数はオブジェクト型に対して有効です。配列や関数に対しても使用できます
Object.create()
これは特性とは無関係ですが Object.create(対象オブジェクト) とすると対象オブジェクトの分身(インスタンス)を作成することができます。 new 関数() みたいなものです。
Object.create() で作成した分身は、対象オブジェクトの特性を引き継ぎます
キーの特性設定
キー自体に特性を設定します
Object.defineProperties(対象オブジェクト, {キー名:{特性の設定}});
value | 値 |
---|---|
writable | 値が変更可能ならtrue (初期値false) |
configurable | キーの削除や設定が可能ならtrue (初期値false) |
enumerable | for...in やObject.keys() でキーを取り出せるならtrue (初期値false) |
get | 値が取得された時に自動的に呼ばれる関数 (getとvalueは両方持つことはできません) |
set | 値が代入された時に自動的に呼ばれる関数。関数の引数に代入された値を取れる |
defineProperties() の使用例 var o = {}; o.a = 1; o.b = 2; // ↑と↓は等価です var o = {}; Object.defineProperties(o, { a:{ value : 1, writable : true, configurable : true, enumerable : true }, b:{ value : 2, writable : true, configurable : true, enumerable : true } });
キーの特性確認
キーの特性を確認します
var キーの特性 = Object.getOwnPropertyDescriptor(対象オブジェクト, “キー名”);
キーの特性はオブジェクトで得られます
{value: 1, writable: true, configurable: true, enumerable: true}