アウトライン
JavaScriptは、内部データ構造は、このようなプロパティが書き込み可能である、などが横断することができるかどうかのように、その動作を制御し、オブジェクトのプロパティを記述するために使用されて提供されます。この内部データ構造は、(オブジェクトの属性)「属性は、オブジェクトを記述」と呼ばれます。属性は、各オブジェクトのプロパティは、メタ属性のいくつかの情報を、独自に対応する店舗を持って説明しています。
{
値:123、
書き込み可能:偽、
列挙:真、
設定可能な値:false、
取得:未定義、
セット:未定義
}
属性は、オブジェクトが6元を提供するために、属性について説明します。
(1)値
属性値のデフォルトの属性値が定義されていないです。
(2)書き込み可能
書き込み可能な属性値(値)が(書き込み可能かどうか、である)を変化させることができるかどうかを示すブール値であり、デフォルトはtrueです。
(3)列挙
列挙は、デフォルトはtrueで、プロパティを反復することができるかどうかを示すブール値です。falseに設定した場合、このプロパティはスキップされている特定の(などのために...ループのように、Object.keys())操作が発生します。
(4)設定
設定可能で、設定、デフォルトを示すブール値がtrueです。falseに設定すると、プロパティを書き換える特定の操作を防止する場合、そのようなプロパティが削除された、また(プロパティ値を除く)プロパティのオブジェクト記述のプロパティを変更することはできません。言い換えれば、設定可能な属性のコントロールは、オブジェクトを説明する属性を記述することができます。
(5)GET
GET機能(ゲッター)のプロパティ値が、デフォルトは定義されていないことを示している機能です。
(6)セット
組属性(セッター)に格納された値の関数を表す関数であり、デフォルト値は未定義です。
Object.getOwnPropertyDescriptor()
Object.getOwnPropertyDescriptor()メソッドは、オブジェクト属性の説明を取得します。その最初のパラメータはターゲット・オブジェクトである、2番目のパラメータは、ターゲット・オブジェクトの属性名に対応する文字列です。
VAR OBJ = {P 'A'}。
Object.getOwnPropertyDescriptor(OBJ、 'P')
//オブジェクト{値: ""、
//書き込み可能:真、
//列挙:真、
//設定可能:真
//}
プロパティを取得するために上記のコード、Object.getOwnPropertyDescriptor()メソッドは、オブジェクトを説明obj.p. このメソッドは、だけでなく、継承されたプロパティに、オブジェクト自身のプロパティのために使用することができます。
Object.getOwnPropertyNames()
Object.getOwnPropertyNames方法は、すべてのメンバーの配列にかかわらず、財産を繰り返すことができるかどうかの、プロパティ名パラメータオブジェクト自身のプロパティで返されます。異なるとこの動作Object.keysは、Object.keysはname属性だけを横切ることができるオブジェクト自体のすべてのプロパティを返します。
属性が存在する場合、Object.defineProperty()メソッドは、特性に対応する更新されたオブジェクトのプロパティに記載しました。
定義使い捨てまたは変更特性の複数Object.defineProperties()メソッドを使用することができる場合。
要素のプロパティ
彼らは、プロパティ属性制御として見ることができるようにプロパティ説明各オブジェクトは、「要素のプロパティ」と呼ばれています。
値
value属性は、ターゲットプロパティの値です。
VAR OBJ = {};
obj.p = 123。
Object.getOwnPropertyDescriptor(OBJ、 'P')。値
// 123
Object.defineProperty(OBJ、 'P'、{値:246});
obj.p // 246
上記のコードによってプロパティ値、obj.p例を読み出しまたは書き換え。
書き込み可能
書き込み可能な属性は、ターゲット属性(値)の値を決定するブール値を変更することができます。
VAR OBJ = {};
Object.defineProperty(OBJ、 '、{
値:37、
書き込み可能:偽
});
obj.a // 37
obj.a = 25。
obj.a // 37
書き込み可能な属性obj.a上記のコードは、falseです。その後、何の効果もありません値obj.aを変更します。
通常モードでは、falseに書き込み可能な属性の割り当てを与えられていないことに注意、だけ静かに失敗します。しかし、厳密モード誤差、プロパティがあっても同じ値を再割り当て。
上記のコードは、その特性がfooに書き込まれていない、プロトプロトタイプオブジェクトです。OBJオブジェクト継承プロト、あなたは、このプロパティaをカスタマイズすることはできません。strictモードならば、これはエラーをスローします。
ただし、回避策は、この制限を回避プロパティ記述されたオブジェクトによって覆われているがあります。その理由は、この場合には、プロトタイプチェーンが完全に無視されるということです。
列挙
列挙(利用可能なエルゴード)がターゲットプロパティを横断することができるかどうかを示すブール値を返します。
JavaScriptの以前のバージョンでは、のために...ループ内でオペレータに基づいています。我々は、それがオブジェクト自体または継承の財産であるかどうかをオペレータに、それはtrueを返します、ということを知っています。
VAR OBJ = {};
OBJの 'のtoString' //真
上記のコードでは、独自のない性質でなく、リードが財産をToStringメソッド真のオペレータに戻り、内のtoString OBJオブジェクトは、ループトラバース中のため...もあります。
これは明らかに合理的ではない、と後でコンセプトの「一筆書き」の導入について。唯一の財産を通過することができ、それがために...ループ繰り返し処理であること、また、このクラスのインスタンスオブジェクト継承ネイティブ属性をToStringメソッドを提供しますので、の可用性を確保し、トラバース可能ではありません...ループで。
列挙属性がfalseの場合は具体的には、次の3つの操作がプロパティに取られていません。
このfor..inループ
Object.keys方法
JSON.stringify方法
構成可能
(設定)設定は、ブール値を返すオブジェクトが記述属性を変更できるかどうかを判断します。換言すれば、偽の値、書き込み可能な、列挙及び構成を変更しない場合に設定。書き込み可能な真にのみfalseがfalseにtrueが許可されて、文句を言います。値については、限り書き込み可能とtrueに設定可能があるとして、それは変更することができます。また、書き込み可能で、直接のターゲット属性の割り当て、エラーではなく偽のですが、成功しません。
設定可能な属性は、(削除)ターゲットを削除することができるかどうかを決定します。
VAR OBJ = Object.defineProperties({}、{
P1:{値:1、設定:真}
P2:{値:2、設定:偽}
});
//真obj.p1削除
obj.p2 //偽の削除
アクセサ
直接施設以外の定義に加えて、アクセサ(アクセサ)を定義することができます。前記セッターストアドバリュー関数は、オブジェクト属性の記述セットプロパティを使用して、と呼ばれ、値関数がゲッターと呼ばれ、属性記述を使用してオブジェクトの属性を取得します。
ターゲット属性は、アクセサを定義したら、その後、アクセス時間は、対応する機能を実行します。この機能を使用すると、そのようなプロパティ禁止の割り当てなど、多くの高度な機能を実現することができます。
VAR OBJ = Object.defineProperty({}、 'P'、{
取得:関数(){
「ゲッター」を返します。
}、
セット:関数(値){
console.log( 'セッター:' +値);
}
});
obj.p // "ゲッター"
obj.p = 123 // "セッター:123"
上記のコードでは、obj.pは、取得および設定のプロパティを定義しました。obj.p値は、getと呼ばれる場合は、割り当てが、それはセットを呼び出します。
JavaScriptはまた、アクセサの別の方法を提供します。
VAR OBJ = {
GET P(){
「ゲッター」を返します。
}、
集合P(値){
console.log( 'セッター:' +値);
}
}。
オブジェクト定義された属性の上記の明細書は同等であり、より広く使用されています。
なお、パラメータの値は、関数、唯一のパラメータセット(即ち、属性値)を受け入れることができる格納された値の関数を得る受け入れることができません。オブジェクトのプロパティの値は、内部データに依存するアクセスは、多くの場合、使用されます。
Controlオブジェクトの状態
時には、オブジェクトの読み書きを凍結する必要がある、オブジェクトの変化を防止することです。JavaScriptは3つの冷凍方法を提供し、最も弱い1はObject.preventExtensionsで、Object.seal、最強Object.freezeが続きました。
オブジェクトを作成するObject.preventExtensions方法は、新しい属性を追加することはできません。
方法Object.preventExtensionsを用いて対象物か否かをチェックするObject.isExtensible方法。言い換えれば、あなたがオブジェクトにプロパティを追加できるかどうかを確認してください。
Object.seal方法は、新しい属性を追加することはできませんいずれかのオブジェクトは、古いプロパティを削除することはできませんことができます。
方法Object.sealを使用してオブジェクトかどうかをチェックするための方法をObject.isSealed。
オブジェクトを作成するObject.freeze方法は、あなたがこのオブジェクトが効果的に一定になる作り、プロパティの値を変更することはできません、あなたは古いプロパティを削除することはできません、新しい属性を追加することはできません。
方法Object.freezeを使用してオブジェクトかどうかをチェックするObject.isFrozen方法。一つの使用Object.isFrozenは、オブジェクトが凍結されていないことを確認した後、そのプロパティの割り当ての後に、です。