JSのデータ属性とアクセス属性
5783 ワード
JSデータ属性&アクセス属性
一つのjsオブジェクト(Object、Funct)は、二つのタイプの属性を定義できます.データ属性 または アクセス器のプロパティ
共通の特性
データ属性とアクセス属性は共通の2つの特徴があります.
enumerableはされることができますか?
データ属性の特徴は共通の特徴の2つ以外にも2つあります.
value定義値writableは再割当可能かどうかデータ属性は基本的な値属性です.一般的な方法でオブジェクトを作成する場合
アクセス器属性の特徴は、共通の特徴の2つに加えて、2つあります.
getがこの属性にアクセスすると自動呼び出しsetが属性を再割り当てすると自動的にを呼び出します.
アクセス器の属性は、属性の割り当てやアクセスの際に他のいくつかの動作をすることができます.
ピット一:定義
アクセス属性を定義すると、データの属性に代わり、valueをなくします.
一つの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