JavaScriptでオブジェクトのプロパティの詳細情報を取得したい場合、`Reflect.getOwnPropertyDescriptor()`メソッドを使用することができます。このメソッドを使うことで、プロパティの属性(書き込み可能か、列挙可能か、など)を簡単に確認することができます。

Reflect.getOwnPropertyDescriptor()の基本的な使い方

const obj = { name: "JavaScript" };
const descriptor = Reflect.getOwnPropertyDescriptor(obj, "name");
console.log(descriptor);
// 出力:
// {
//   value: "JavaScript",
//   writable: true,
//   enumerable: true,
//   configurable: true
// }

戻り値の各プロパティの意味

  • `value`: プロパティの値
  • `writable`: 値の変更が可能かどうか(true/false)
  • `enumerable`: for...inループなどで列挙可能かどうか(true/false)
  • `configurable`: プロパティの削除や属性の変更が可能かどうか(true/false)

実践的な使用例

1. 読み取り専用プロパティの確認

const user = {};
Object.defineProperty(user, "id", {
  value: 123,
  writable: false
});

const descriptor = Reflect.getOwnPropertyDescriptor(user, "id");
console.log(descriptor.writable); // false

2. getterとsetterの確認

const person = {
  get name() {
    return "John";
  }
};

const descriptor = Reflect.getOwnPropertyDescriptor(person, "name");
console.log(descriptor.get); // [Function: get name]
console.log(descriptor.set); // undefined

Object.getOwnPropertyDescriptor()との違い

`Reflect.getOwnPropertyDescriptor()`は`Object.getOwnPropertyDescriptor()`とほぼ同じ機能を提供しますが、以下の違いがあります:

1. エラー処理

  • `Reflect.getOwnPropertyDescriptor()`は第1引数が非オブジェクトの場合、TypeErrorをスローします
  • `Object.getOwnPropertyDescriptor()`は第1引数を自動的にオブジェクトに変換しようとします
// エラーになる例
Reflect.getOwnPropertyDescriptor(null, "prop"); // TypeError

// エラーにならない例
Object.getOwnPropertyDescriptor(null, "prop"); // undefined

実用的なユースケース

プロパティの属性チェック

function isWritable(obj, prop) {
  const descriptor = Reflect.getOwnPropertyDescriptor(obj, prop);
  return descriptor ? descriptor.writable : false;
}

const obj = { name: "test" };
console.log(isWritable(obj, "name")); // true

プロパティのコピー時の属性保持

function copyPropertyWithDescriptor(source, target, prop) {
  const descriptor = Reflect.getOwnPropertyDescriptor(source, prop);
  if (descriptor) {
    Object.defineProperty(target, prop, descriptor);
  }
}

const source = { name: "source" };
const target = {};
copyPropertyWithDescriptor(source, target, "name");

まとめ

`Reflect.getOwnPropertyDescriptor()`は、オブジェクトのプロパティの詳細な情報を取得するための強力なツールです。プロパティの属性を確認したり、プロパティのコピー時に元の属性を保持したりする場合に特に有用です。また、モダンなJavaScriptプログラミングにおいて、Reflectを使用することで、より堅牢なコードを書くことができます。

エラー処理が厳密なため、型安全なコードを書く場合は`Object.getOwnPropertyDescriptor()`よりも`Reflect.getOwnPropertyDescriptor()`を使用することをお勧めします。