オブジェクトとキーの特性設定
オブジェクトの特性設定
オブジェクト自体に特性を設定します。
値を変更できなくしたり、キーを削除できなくしたり、キーを追加できなくすることができます
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}