データのプロパティとアクセスのプロパティ


JavaScriptでは、オブジェクトを「無秩序属性のセット」と定義し、その属性は基本値、オブジェクトまたは関数を含むことができます.オブジェクトに相当するグループは特定の順序がない値です.
JavaScriptでは、2つの異なる属性が定義されています.データ属性とアクセス属性です.データ属性は一般的にデータ値を格納するために使用され、アクセス属性は一般的にget/set動作のために使用され、直接データ値を記憶することができないES 5において、属性の様々な特徴を記述するために、特性を定義している.JavaScriptでは直接的に特性にアクセスできません.私たちはそれを相手の括弧に入れます.例えば[Enumerable].
データのプロパティ
4つの特性(最初の3つのデフォルト値はtrueの最後のデフォルト値はundefined)
[[Configrable]:プロパティをdeleteで削除して属性を再定義することができるかどうか、属性の特性を変更することができるかどうか、またはアクセス属性に属性を変更することができるかどうかを示す(配置可能か)
[[Enumerable]:for-i-nループで属性に戻れるかどうかを示します.
[[Writable]:属性を変更できるかどうかを示す値(修正可能か)
[[Value]:この属性のデータ値を含みます.属性を読み取るときは、この位置から読み、属性を書き込むときは、新しい値をこの位置に保存します.
 
デフォルトの属性の特性を変更するには、ES 5のObject.defineProperty()メソッドが必要です.この方法は3つのパラメータを受信します.属性があるオブジェクト、属性の名前、および記述子オブジェクト(記述子オブジェクトの属性はconfigurble、enumerable、writable、valueでなければなりません.1つ以上の値を設定して、対応する特性値を変更できます.)
var person={};
Object.defineProperty(person,'name',{
	writable:false,
	value:'Nicholas'
});
alert(person.name);//Nicholas
person.name='Greg';
alert(person.name);//Nicholas
属性が設定不可になったら、設定に戻すことができません.すなわち、configurbleをfalseに設定したら、trueに戻すことはできません.そうでないとエラーが発生します.
アクセサのプロパティ
アクセス属性にはデータ値が含まれていません.ペアgetterとsetter関数が含まれています.アクセス属性を読み込むと、getter関数が呼び出されます.この関数は有効な値を返します.アクセスのプロパティを書き込みすると、setter関数を呼び出して新しい値を入力します.この関数はどのように関数を処理するかを決定します.アクセス器のプロパティには4つの特性があります.
[[Configrable]:プロパティをdeleteで削除して属性を再定義できるかどうか、属性の特性を変更できるかどうか、または属性をデータ属性に変更できるかどうかを示す.デフォルトはtrueです
[[Enumerable]:for-i-nループで属性に戻れるかどうかを示します.デフォルトはtrueです
[[Get]:プロパティの読み込み時に呼び出す関数です.デフォルトはundefinedです.
[設定]:属性の書き込み時に呼び出す関数です.デフォルトはundefinedです.
 
アクセス属性は直接定義できません.Object.defineProperty()を使用して定義しなければなりません.
var book={
	_year:2004,
	edition:1
};
Object.defineProperty(book,'year',{
	get:function(){
		return this._year+this.edition;
	},
	set:function(newValue){
		if(newValue>2004){
			this.edition+=newValue-2004;
		};
	}
});
book.year=2005;
console.log(book.edition);//2
console.log(book.year);//2006
console.log(book._year);//2004
注意:ゲッターとセッターを同時に指定しないといけません.getterを指定するだけでは、プロパティを書くことができないことを意味します.書き込み属性は無視されます.厳しいモードではエラーが発生します.setter関数だけを指定しても読めません.そうしないとundefinedに戻ります.厳格なモードではエラーが発生します.
 
複数の属性を定義
Object.defineProperties()を使用する方法
var person={
	_name:'Scott',
	_age:24,
	_tel:86247
};
Object.defineProperties(person,{
	name:{
		get:function(){
			return this._name;
		}
	},
	age:{
		set:function(p){
			this._age=p;
		}
	},
	tel:{
		get:function(){
			return this._tel;
		},
		set:function(p){
			this._tel=p;
		}
	}
});