ウェブデザインの実戦的JavaScript(7)--対象属性の特性値
24033 ワード
オブジェクト属性には名前と値の他に、書き込み可能、列挙可能、設定可能ないくつかの識別機能が含まれています.ECMAScript 3ではこれらの特性は設定できません.すべてのECMAScript 3プログラムで作成された属性は書き込み可能、列挙可能、配置可能であり、これらの特性を修正することができません.ECMAScript 5は、ライブラリ開発者にとって重要なこれらの属性特性を問い合わせるAPIを提供し、設定する.
データ属性は、4つの特性を含む.値、可読性、エニュメレート・コンフィギュレーション.
アクセサ属性は値特性(getter方法の存在の有無によって決定される)と書き込み可能性がない(setter方法の存在の有無によって決定される).
属性特性のクエリーと設定操作を実現するために、ECMAScript 5は「属性記述子」というオブジェクトを定義し、このオブジェクトはその4つの特性を表しています.属性記述子オブジェクトの属性と記述された属性特性は同名であるため、その属性は、value、writable、enumerable、configrableである.アクセサ属性の記述子オブジェクトは、valueとwritableの代わりにgetとsetを使用します.
Object.getOwn PropertyDescriptor()を呼び出して、あるオブジェクトの特定の属性値の属性記述子を得ることができます.
1.属性の特性は次の6つを含む. configrable:プロパティをdeleteで削除して属性を再定義できるかどうかを示し、属性の特性を変更することができます.デフォルトはtrue です. enumberbale:for-i nを通じて属性にループバックできるかどうかを示します.デフォルトはtrue です. writable:属性を変更することができますか?デフォルトはtrue です. value:この属性のデータ値を含む.属性値を読み込むとき、この属性から読み、属性を書き込むとき、新しい値をこの位置に保存します.デフォルト値はundefineです. getter:属性の読み取り時に呼び出す関数 setter:属性の書き込み時に呼び出す関数 Object.defineProperty方法を呼び出した後、それらの未定義の特性値はconfigrableがfalseである以外、他はundefinedである.
2、単一属性の特性を変更する:
Object.defineProperty()方法を使用しなければなりません.この方法は3つのパラメータを受け入れる.属性があるオブジェクト 属性の名前 のディスクリプタオブジェクト. ここで、ディスクリプタオブジェクトの属性は、configrable、enumberble、writable、valueでなければなりません.そのうちの一つまたは複数の値を設定して、対応する特性値を変更することができます.
また、一旦、私たちはある属性の特性を設定して、配置不可にしたら、これを配置可能なものに戻すことはできなくなります.この場合、Object.definePropertyを呼び出す方法は、writable以外の特性を修正するとエラーが発生します.
(1)、writableの特性を修正する:
falseに設定します.属性値を変更できないようにします.
falseに設定されているので、プロパティはdelete(削除)できません.
Object.definePropertiesを使って説明符で複数の属性を一度に定義します.この方法では2つのオブジェクトのパラメータを受け付けます.最初のオブジェクトは追加と修正の対象です.2番目のオブジェクトの属性は最初のオブジェクトに追加または変更する順序に対応します.
属性の特性を読み込み、Object.getOwn PropertyDescriptrメソッドを使用します.
データ属性は、4つの特性を含む.値、可読性、エニュメレート・コンフィギュレーション.
アクセサ属性は値特性(getter方法の存在の有無によって決定される)と書き込み可能性がない(setter方法の存在の有無によって決定される).
属性特性のクエリーと設定操作を実現するために、ECMAScript 5は「属性記述子」というオブジェクトを定義し、このオブジェクトはその4つの特性を表しています.属性記述子オブジェクトの属性と記述された属性特性は同名であるため、その属性は、value、writable、enumerable、configrableである.アクセサ属性の記述子オブジェクトは、valueとwritableの代わりにgetとsetを使用します.
Object.getOwn PropertyDescriptor()を呼び出して、あるオブジェクトの特定の属性値の属性記述子を得ることができます.
1.属性の特性は次の6つを含む.
2、単一属性の特性を変更する:
Object.defineProperty()方法を使用しなければなりません.この方法は3つのパラメータを受け入れる.
また、一旦、私たちはある属性の特性を設定して、配置不可にしたら、これを配置可能なものに戻すことはできなくなります.この場合、Object.definePropertyを呼び出す方法は、writable以外の特性を修正するとエラーが発生します.
(1)、writableの特性を修正する:
falseに設定します.属性値を変更できないようにします.
var person = {};
Object.defineProperty(person, "name", {
writable: false,//
value: "Tom" // name Tom
});
person.name = "Jany"; // name Jany, . ,
console.log(person.name); // Tom
(2)configrabel特性を修正し、falseに設定されているので、プロパティはdelete(削除)できません.
var person = {};
Object.defineProperty(person, "name", {
configurable: false, // configurable false
value: "Tom"
});
console.log(person.name); // Tom
delete person.name; // name
console.log(person.name); // name , Tom
configrable属性値をtrueに変更すれば、プロパティはdeleteに変更できます. var person = {};
Object.defineProperty(person, "name", {
configurable: true,
value: "Tom"
});
console.log(person.name); // Tom
delete person.name; // name
console.log(person.name); // , udefined
また、一旦、私たちはある属性の特性を設定したら、もう配置可能なものに戻すことができなくなります.この時、Object.defineProperty()を呼び出して、writable以外の特性を修正すると、エラーが発生します.var person = {};
// person.name configurable false;
Object.defineProperty(person, "name", {
configurable: false,
value: "Tome"
});
// person.name configurable true; 。
Object.defineProperty(person, "name", {
configurable: true,
value: "lyl"
});
console.log(person.name);
(3)、getterとsetterの特性を修正する // book
var book = {
_year: 2004, //
edition: 1 //
};
// year
Object.defineProperty(book, "year", {
// get , book.year year , book._year
get: function() {
return this._year;
},
// set , book.year , book._year book.edition
set: function(newValue) {
if(newValue > 2004) {
this._year = newValue;
this.edition += newValue - 2004;
}
}
});
book.year = 2005;
console.log(book.edition); //2
3、複数の属性を同時に定義(修正)する特性Object.definePropertiesを使って説明符で複数の属性を一度に定義します.この方法では2つのオブジェクトのパラメータを受け付けます.最初のオブジェクトは追加と修正の対象です.2番目のオブジェクトの属性は最初のオブジェクトに追加または変更する順序に対応します.
var book = {};
Object.defineProperties(book, {
// _year, 2004
_year: {
value: 2004
},
// edition, 1,
edition: {
value: 1,
writable: true//
},
// year, get set
year: {
get: function() {
return this._year;
},
set: function(newValue){
if(newValue > 2004) {
//alert("ok");
this._year = newValue;
this.edition += newValue-2004;
}
}
}
});
book.year = 2006;
console.log(book.edition);//3
4.属性の特性を読み取る属性の特性を読み込み、Object.getOwn PropertyDescriptrメソッドを使用します.
var book = {};
//
Object.defineProperties(book, {
_year: {
value: 2004
},
edition: {
value: 1,
writable: true//
},
year: {
get: function() {
return this._year;
},
set: function(newValue){
if(newValue > 2004) {
//alert("ok");
this._year = newValue;
this.edition += newValue-2004;
}
}
}
});
// _year
var descriptor1 = Object.getOwnPropertyDescriptor(book, "_year");
console.log(descriptor1.configurable); //false
console.log(descriptor1.enumberable); //undefinded
console.log(descriptor1.writable); //false
console.log(descriptor1.value); //2004
console.log(descriptor1.get); //undefined
console.log(descriptor1.set); //undefined
console.log("
");
// year
var descriptor2 = Object.getOwnPropertyDescriptor(book, "year");
console.log(descriptor2.configurable); //false
console.log(descriptor2.enumberable); //undefined
console.log(descriptor2.writable); //undefined
console.log(descriptor2.value); //undefined
console.log(descriptor2.get); //function()
console.log(descriptor2.set); //function(value)