オブジェクトとキーの特性設定

オブジェクトの特性設定

オブジェクト自体に特性を設定します。
値を変更できなくしたり、キーを削除できなくしたり、キーを追加できなくすることができます

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)
enumerablefor...inObject.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}