Object.defineProperty()

このエントリーをはてなブックマークに追加

Object.defineProperty()はプロパティの作成時に様々な付加情報を加えることができるメソッドです。

指定できる付加情報は値(value)に加えて列挙可能(enumerable)か、削除可能(configurable)か、変更可能(writable)か、さらに、getter/setterの指定が可能なっています。

値(value)の設定

まずはvalueを設定してみましょう。Object.defineProperty()は第一引数でプロパティを設定したいオブジェクト、第二引数でプロパティ名、第三引数で各種の設定を行います。今回は値(value)に “bar”という文字列を挿入する処理を記述しています。

var obj = {};
Object.defineProperty(obj,"prop",{
	value : "bar"
});
console.log(obj.prop);//bar
obj.prop = "foo";
console.log(obj.prop);bar

特筆すべきは「obj.prop = “foo”;」とプロパティを上書きしているにもかかわらず上書かれていない点でしょう。Object.defineProperty()の各種設定には初期値があり、変更可能(writable)のデフォルト値はfalseになっている為、上書くことができません。

ちなみに、valueの初期値はundefinedです。

列挙可能(enumerable)

下記のようにenumerableを指定しないケース(prop1)とenumerableを指定したケース(prop1)をfor in 構文で列挙した場合console上に出力されるのは「prop2:bar2」のみです。

var obj = {};
Object.defineProperty(obj,"prop1",{
	value : "bar1"
});
for(var key in obj){
	console.log("prop1:"+obj[key]);
}
Object.defineProperty(obj,"prop2",{
	value : "bar2",
	enumerable : true
});
for(var key in obj){
	console.log("prop2:"+obj[key]);
}

enumerableの初期値はfalseであり、明示的にtrueを指定しなければfor in 構文などで列挙することができません。

削除可能(configurable)

configurableは削除可能かどうかの設定でtrueを指定することでプロパティの削除が可能になります。

var obj = {};
Object.defineProperty(obj,"prop1",{
	value : "bar1"
});
console.log(obj.prop1);//bar1
delete obj.prop1;
console.log(obj.prop1);//bar1

Object.defineProperty(obj,"prop2",{
	value : "bar2",
	configurable : true
});
console.log(obj.prop2);//bar2
delete obj.prop2;
console.log(obj.prop2);//undefined

変更可能(writable)

writableは書き換え可能かどうかの設定でtrueを指定することでプロパティの書き換えが可能になります。

var obj = {};
Object.defineProperty(obj,"prop1",{
	value : "bar1"
});
console.log(obj.prop1);//bar1
obj.prop1 = "bar1-2";
console.log(obj.prop1);//bar1

Object.defineProperty(obj,"prop2",{
	value : "bar2",
	writable : true
});
console.log(obj.prop2);//bar2
obj.prop2 = "bar2-2";
console.log(obj.prop2);//bar2-2

setter/getter

また、setter/getterを用いてsetter/getterを介してのみプロパティの制御を可能にすることができます。

var obj = {};
(function(){
	var _prop = "bar1"
	Object.defineProperty(obj,"prop",{
		get: function(){
			return _prop;
		},
		set: function(value){
			_prop = value;
		}
	});
})();
console.log(obj.prop);//bar1
obj.prop = "bar2";
console.log(obj.prop);//bar2

setterのみを指定することで書き出し専用、getterのみを指定することで読み込み専用などの区別を付けることができます。

複数のプロパティを同時にしたい場合はObject.defineProperties()を利用します。

登録日 : 2015年08月11日 最終更新日 : 2015年8月12日

同じカテゴリー(Object)のエントリー

検索

スポンサードリンク

バージョン

リファレンス