JSのデータ属性とアクセス属性

5783 ワード

JSデータ属性&アクセス属性
一つのjsオブジェクト(Object、Funct)は、二つのタイプの属性を定義できます.データ属性 または アクセス器のプロパティ
共通の特性
データ属性とアクセス属性は共通の2つの特徴があります.
enumerableはされることができますか?  for-in エニュメレーションconfigrableは被  delete キーワード削除データのプロパティ
データ属性の特徴は共通の特徴の2つ以外にも2つあります.
value定義値writableは再割当可能かどうかデータ属性は基本的な値属性です.一般的な方法でオブジェクトを作成する場合  var obj = {age:12} ,生成された属性はデータ属性であり、  enumerable 、 configurable 、  writable 標準設定はtrueです.
var person = {
    age:12
}
//Object {value: 12, writable: true, enumerable: true, configurable: true}
Object.getOwnPropertyDescriptor(person,'age');  
1 2 3 4 5 アクセサのプロパティ
アクセス器属性の特徴は、共通の特徴の2つに加えて、2つあります.
getがこの属性にアクセスすると自動呼び出しsetが属性を再割り当てすると自動的にを呼び出します.
アクセス器の属性は、属性の割り当てやアクセスの際に他のいくつかの動作をすることができます.getまたはset方法を定義する時に、thisを使用しないでください.
var person = {name:"teacher",_age:12};
Object.defineProperty(person,"age",{
    get : function(){
        console.log(this)
        return this._age; //       this.age,       
    },
    set : function(newVal){
        this._age = newVal;
    }
})
person.age; // Object {name: "teacher" , _age : 12} 12
1 2 3 4 5 6 7 8 9 10 11 注意
ピット一:定義  get 和  set の場合は、単独で定義します.  get この属性はアクセスのみで、書き換えはできません.
var person = {name:"teacher"};
Object.defineProperty(person,"age",{
    get : function(){
        return age; //       this.age,       
    }
})
person.age; // Uncaught ReferenceError: age is not defined(…) 

person.age = 12;

person.age; // Uncaught ReferenceError: age is not defined(…)
1 2 3 4 5 6 7 8 9 10 11 ピット二:アクセス器の属性とデータの属性は一つしかないです.
アクセス属性を定義すると、データの属性に代わり、valueをなくします.
var person = {age:12};

// Object {value: 12, writable: true, enumerable: true, configurable: true}
Object.getOwnPropertyDescriptor(person,"age"); 

Object.defineProperty(person,"age",{
    get : function(){
        return age; //       this.age,       
    }
})

// Object {set: undefined, enumerable: true, configurable: true}
Object.getOwnPropertyDescriptor(person,"age"); 

person.age; // Uncaught ReferenceError: age is not defined(…)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 両方が定義されている場合、エラーが発生します.
var person = {};
Object.defineProperty(person,"age",{
    get : function(){
        return age;
    }, //        

    value : 12 //       
})
// Uncaught TypeError: Invalid property descriptor. Cannot both specify accessors and a value or writable attribute, #(…)
1 2 3 4 5 6 7 8 9 ピット三:データ属性とアクセス属性は複数回定義できません.
var person = {};
Object.defineProperty(person,"age",{
    valule : 12
})

person.age; // 12

Object.defineProperty(person,"age",{
    value : 13
}) 
// Uncaught TypeError: Cannot redefine property: age(…)

Object.defineProperty(person,"age",{
    get : function(){
        return age;
    }
})
// Uncaught TypeError: Cannot redefine property: age(…)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19