1.属性記述オブジェクトの概念
JavaScriptは、オブジェクト属性を記述し、その動作を制御するために使用される内部データ構造を提供します。この内部データ構造は、属性記述オブジェクトと呼ばれます。各属性には、対応する独自の属性記述オブジェクトがあり、属性の元の情報を保存します。
例
{
value:'111',//默认是undefined
writable:true, //值为true或false value值是否可改变
enumberable:true, // 该属性是否可遍历 设置false则执行for...in循环或者Object.keys则会跳过该属性值
configurable:true,//是否可配置修改这些元属性(即 writable/enumberable/configurable)
get:undefined,//是一个函数 ,表示该属性的取值函数getter,默认为undefined
set:undefined,//是一个函数,表示该属性的存值函数getter,默认为undifined
}
2.プロパティを取得するために一般的に使用される4つの関数
1.Object.getOwnPropertyDescriptor()およびObject.getOwnPropertyDescriptors()オブジェクトのプロパティ記述オブジェクトを取得します。
どちらも取得オブジェクトのプロパティ記述オブジェクトです。構文は次のとおりです。
Object.getOwnPropertyDescriptors(Array)
Object.getOwnPropertyDescriptor(Array,key)
2. Obect.getOwnPropertyNames()は、プロパティをトラバースできるかどうかに関係なく、オブジェクト内のすべてのプロパティ名の配列を返します。
例
3. Object.defineProperty()(プロパティを変更)およびObject.defineProperties(複数のプロパティを変更)。
この関数を使用すると、オブジェクト定義を記述したり、プロパティを介して1つ以上のプロパティを変更したり、変更したオブジェクトを返したりできます
。Object.defineProperty()の使用例
Object.defineProperties()の使用例
4. Object.prototype.propertylsEnumberable()は、ブール値を返し、特定の各属性をトラバースできるかどうか
使用例使用する
ときは構文に注意してください
array.propertyIsEnumerable('+key+')
5.メタ属性の変更
- falseの場合、書き込み可能が割り当てられ、割り当てが失敗し、通常の状況ではエラーは報告されませんが、元の値が再割り当てされても、厳密モードではエラーが報告されます。同時に、サブオブジェクトはその値をカスタマイズできません。
注:サブオブジェクトが再割り当てする場合は、サブオブジェクトの書き込み可能な属性を再上書きできます。 - falseの場合に列挙可能for ... in / Object.keys()/ JSON.stringify()は属性を取得しません(ループは属性を取得しませんが、直接取得できます)
- 設定可能な変更値/書き込み可能/列挙可能/設定可能falseの条件下ではエラーが報告されますが、設定可能をtrueからfalseに変更できます。直接割り当てはエラーを報告しませんが成功しません(設定可能がtrueの場合、属性は次のようになります。削除済み、Falseは属性を削除できないことを意味します)
6.
アクセサ直接定義に加えて、属性値はアクセサによって定義することもできます。プリペイド関数はsetterと呼ばれ、プロパティで記述されたsetter値が使用され、value関数はgetterと呼ばれます。プロパティで記述されたgetter値はgetterと呼ばれます。
アクセサーが定義されると、対応するsetter / getter関数はアクセスが許可されている限り実行され、設定に使用できます。属性のコピーの禁止など、多くの高度な機能。
使用例
注:set関数とget関数の設定後に値を同時に定義することはできません
。
アクセサのタイプは、属性の値がオブジェクトの内部データに依存する場合によく使用されます。
7.
オブジェクトの状態を制御するための3つのフリーズメソッド1.Object.preventExtensions()を使用すると、オブジェクトが新しいプロパティ
Object.isExtensible()を追加して、オブジェクトがこのメソッドを使用しているかどうかを確認できなくなります。
2. Object.seal()。これにより、オブジェクトは新しいプロパティを追加したり、古いプロパティを削除したりできなくなります。このメソッドは、特定のプロパティの値の変更には影響しません。Object.isSealed()を使用して、オブジェクトがObject.seal()
3、Object.freeze()を使用しているかどうかを確認できます。新しいプロパティを追加したり、古いプロパティを削除したり、プロパティ値を変更して定数にすることはできませんObject.isFrozen()はObject.freeze()が
使用されているかどうかを確認
できます上記の3つのメソッドの制限は、プロトタイプオブジェクトを変更することで変更できますオブジェクトに属性を追加するには
var obj = new Object();
Object.preventExtensions(obj);
var proto = Object.getPrototypeOf(obj);
proto.t = 'hello';
obj.t
// hello
このとき、次のようにobjのプロトタイプをフリーズできます。
var obj = new Object();
Object.preventExtensions(obj);
var proto = Object.getPrototypeOf(obj);
proto.t = 'hello';
obj.t
// hello
別の制限があります。上記のメソッドは、次の例に示すように、属性が指すオブジェクトをフリーズしますが、オブジェクト自体のコンテンツをフリーズすることはできません。
var obj = {
foo: 1,
bar: ['a', 'b']
};
Object.freeze(obj);
obj.bar.push('c');
obj.bar // ["a", "b", "c"]