JavaScript で動的にメソッド/プロパティを生成する

JavaScript で動的にメソッドやプロパティを生成するには、 Proxy を使うという方法がある。

例えば、あるメソッドをあらかじめ定義せずに実行したい。とりあえずメソッドを実行したら、そのメソッドの名前を文字列として返すようなオブジェクトが作るようにしよう。以下のような感じがほしい。

// doSomething は事前に定義しない
let result = obj.doSomething()
console.log(result)
// 出力: 'doSomething'

これを実現するには、こうする。

const obj = new Proxy({}, {
  get: (target, name) => () => name
})

let result = obj.doSomething()
console.log(result)

仕組みとしては、 obj.doSomething にアクセスしたときに、 (target, name) => () => name が実行され、 () => 'doSomething' という関数が生まれるというわけ。

この調子で動的なプロパティも作れる。

const obj = new Proxy({}, {
  get: (target, name) => 100
})

console.log(obj.someProperty)
// 出力: 100