Property flags and descriptors
14193 ワード
相手は普段見えないシルエット
📌 エラーは
オブジェクトのプロパティは2つに分類されます
データ属性(dataproperty)
アクセス者プロパティ(accessor property)としてget、setの役割を担当する
「仮象」の番組なので読み書きは可能ですが、実際には存在しません.
これらの
たとえば、生年月日を入力すると、自動的に年齢パーセントを取得したいが、勝手に年齢を変更することはできない.
📌 アクセス者propertyは、データpropertyとは異なり、
Propertyフラグと記述子 プロパティgetterとsetter
writable
、enumerable
、configuable
、getter
、setter
です.1. property flags
1-1. writable
writable
およびtrue
は、値を変更することができるlet user = {
name: "John"
};
Object.defineProperty(user, "name", {
writable: false
});
user.name = "Pete"; // Error: Cannot assign to read only property 'name'
したがって、上記のようにfalse
に設定するとエラーが発生する📌 エラーは
strict mode
でのみ発生します1-2. enumerable
enumerable
およびtrue
は、繰り返し文を使用してリストできます.let user = {
name: "John",
toString() {
return this.name;
}
};
Object.defineProperty(user, "toString", {
enumerable: false
});
// 이제 for...in을 사용해 toString을 열거할 수 없게 되었습니다.
for (let key in user) alert(key); // name
toString
メソッドは、繰り返し文でリストできません.1-3. configurable
configurable
およびtrue
は、番組フラグを削除または変更することができるlet descriptor = Object.getOwnPropertyDescriptor(Math, 'PI');
alert( JSON.stringify(descriptor, null, 2 ) );
/*
{
"value": 3.141592653589793,
"writable": false,
"enumerable": false,
"configurable": false
}
*/
Math.PI = 3; // Error
// 수정도 불가능하지만 지우는 것 역시 불가능합니다.
つまり、変更できないオブジェクトを作成することができます.2. getter, setter
オブジェクトのプロパティは2つに分類されます
データ属性(dataproperty)
アクセス者プロパティ(accessor property)としてget、setの役割を担当する
let obj = {
get propName() {
// getter, obj.propName을 실행할 때 실행되는 코드
},
set propName(value) {
// setter, obj.propName = value를 실행할 때 실행되는 코드
}
};
getter
メソッドは、obj.propName
を使用してプロパティの読み取りを試みたときに実行される.setter
メソッドはobj.propName = value
であり、propertyに値を付与しようとすると実行されるlet user = {
name: "John",
surname: "Smith",
get fullName() {
return `${this.name} ${this.surname}`;
},
set fullName(value) {
[this.name, this.surname] = value.split(" ");
}
};
alert(user.fullName); // John Smith
// 주어진 값을 사용해 set fullName이 실행됩니다.
user.fullName = "Alice Cooper";
alert(user.name); // Alice
alert(user.surname); // Cooper
このようにgetter
,setter
メソッドを実現すると,オブジェクトはfullName
という仮想的なpropertyを生み出す.「仮象」の番組なので読み書きは可能ですが、実際には存在しません.
これらの
getter
、setter
関数は、変更不可能なpropertyを作成するのに適しています.たとえば、生年月日を入力すると、自動的に年齢パーセントを取得したいが、勝手に年齢を変更することはできない.
function User(name, birthday) {
this.name = name;
this.birthday = birthday;
// age는 현재 날짜와 생일을 기준으로 계산됩니다.
Object.defineProperty(this, "age", {
get() {
let todayYear = new Date().getFullYear();
return todayYear - this.birthday.getFullYear();
}
});
}
let john = new User("John", new Date(1992, 6, 1));
alert( john.birthday ); // birthday를 사용할 수 있습니다.
alert( john.age ); // age 역시 사용할 수 있습니다.
ここには他のsetter
関数はありません.age
は読み込めません.変更できません.📌 アクセス者propertyは、データpropertyとは異なり、
value
、writable
ではなく、get
、set
という関数があります.*References
Reference
この問題について(Property flags and descriptors), 我々は、より多くの情報をここで見つけました https://velog.io/@ayaan92/Property-flags-and-descriptorsテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol