Closed6
【JavaScript】PropertyDescriptor

PropertyDescriptor とは
プロパティに高度な設定ができるもの。

getOwnPropertyDescriptor
プロパティは Key と Value から成り立つものではあるが、実はそれだけではない。
const user = {
name: "shion",
age: 99,
};
const result = Object.getOwnPropertyDescriptor(user, "name");
result を出力すると、以下の value 以外の3つのプロパティを含むオブジェクトが表示される。
これらをプロパティディスクリプターという。
{
configurable: true,
enumerable: true,
writable: true,
value: "shion"
}
※ 初期値は全て true となる

defineProperty
プロパティディスクリプターを書き換えることができる。
Object.defineProperty(user, "name", { value: "yamada" });
console.log(user.name); // yamada

プロパティディスクリプター解説
wribale
これを false にすると、書き換えられなくなる。
Object.defineProperty(user, "name", { writable: false });
user.name = "saki"; // Cannot assign to read only property 'name' of object '#<Object>'
ただ、defineProperty
は最強なので、writable が false であっても書き換え可能。
Object.defineProperty(user, "name", { value: "saki" });
console.log(user.name); // saki
enumerable
これを false にすると、ループできなくなる。
以下の例では、name をループ不可能にした。実際ループしても、age だけがループ対象となる。
const result = Object.getOwnPropertyDescriptor(user, "name");
Object.defineProperty(user, "name", { enumerable: false });
for (const key in user) {
console.log(key); // age
}
configurable
これを false にすると、設定不可能になる。
※ ただし value は変更可能
Object.defineProperty(user, "name", { configurable: false });
Object.defineProperty(user, "name", { configurable: true }); // Uncaught TypeError: Cannot redefine property: name

普通のプロパティも追加できる
Object.defineProperty(user, "language", {
value: "ja",
writable: true,
enumerable: false,
configurable: true,
});
console.log(user.language); // ja

PropertyDescriptor の使い所
ライブラリやフレームワークを作成する場合だろうか。
このスクラップは2024/12/18にクローズされました