JavaScriptオブジェクトのproperty属性の詳細


JavaScriptの対象のpropertyは3つの属性があります。1.writable。このpropertyは書くことができますか?2.enumerable。for/in文を使うと、そのpropertyが列挙されますか?3.configrable。このpropertyの属性は修正できますか?propertyは削除できますか?
ECMAScript 3標準では、上の3つの属性の値はすべてtrueであり、変更できません。新規作成対象のpropertyは書き込み可能で、列挙可能で、削除可能です。ECMAScript 5標準では、これらの属性は、propertyの記述対象によって構成および修正され得る。
propertyの値情報もpropertyの属性として見れば、対象のpropertyは四つの属性を持っています。value、writable、enumerable、configurble。
getterとsetterの方法で定義されるpropertyについては、writable属性がないため、このpropertyはsetter方法が存在するかどうかによって書かれています。したがって、このようなpropertyも4つの属性があります。get、set、enumerable、configrable――get、set属性の値はfunctionです。
オブジェクトのpropertyの属性を取得します。
ECMAScript 5規格では、Object.getOwn PropertyDescripter()を介してオブジェクト自体のあるpropertyの属性情報を取得することができます。

var o = {x:1};
var a = Object.create(o);
a.y = 3;
console.log(Object.getOwnPropertyDescriptor(a, "y"));//Object {configurable=true, enumerable=true, writable=true, value=3}
console.log(Object.getOwnPropertyDescriptor(a, "x"));//undefined
は、プロバイダーが存在しない場合やプログレッシブがプロトタイプから継承されている場合、undefinedに戻ります。
オブジェクトのpropertyの属性を設定します。
ECMAScript 5標準では、オブジェクト自体のあるpropertyの属性をObject.definePropertyによって設定することができます。

Object.defineProperty(a, "y", {
    value:3,
    writable:true,
    enumerable:false,
    configuration:true
});
console.log(a.propertyIsEnumerable("y"));//false
に設定されたpropertyが原型オブジェクトから継承された場合、JavaScriptはオブジェクト自体に同名のpropertyを作成します。propertyをgetterまたはsetterでアクセスするように変更することもできます。

Object.defineProperty(a, "x", {
    value:1,
    writable:true,
    enumerable:false,
    configuration:true
});
console.log(a.propertyIsEnumerable("x"));//false
console.log(o.propertyIsEnumerable("x"));//true
はObject.defineProperty()を使用するとき、property記述オブジェクトの属性値は一部無視できます。属性値が無視された場合、JavaScriptの処理規則は以下の通りです。
propertyが新規である場合、無視された属性値はすべてfalseまたはundefinedである。propertyが存在する場合、無視された属性値はそのまま維持されます。
一括設定対象propertyの属性
一度に複数のpropertyの属性を設定する必要がある場合は、Object.defineProperties()文を使用することができます。この文は修正されたオブジェクトを返します。

Object.defineProperty(a, "y", {
    get:function(){return 42;}
});
console.log(a.y);//42
property属性設定規則
property属性を修正する場合は、以下の規則に従わなければなりません。もし規則に違反したら、JavaScriptはTypeErrエラーを報告します。
対象がextenssibleでない場合は、既存のpropertyの属性を修正するしかなく、新たなpropertyを追加することができません。propertyのconfigrable属性がfalseであれば、configrableとenumerable属性の値は変更できません。writable属性については、trueからfalseに変更できますが、falseからtrueに変更することはできません。もしpropertyがgetterとsetterによって定義されたら、getterとsetter方法は修正されない。propertyのconfigrable属性とwritable属性が共にfalseである場合、property値は変更できない。propertyのwritable属性がfalseであるが、そのconfigrable属性がtrueであるなら、property値は依然として修正され得る。