使用字符串调用方法(不是函数)

Invoke a method (not a function) using a string

dup 发现者请注意:如果 dup 显示了如何使用 classes 和方法解决问题,而不仅仅是函数,请随时将其标记为 dup。

我正在构建一个命令行工具,它请求用户输入字符串,然后尝试调用具有匹配方法和参数的 class。我该如何调用才能定义它?

我有一个 class:

class MyClass {
  constructor() {
    this.foo = 'bar';
  }
  myMethod(param) {
    console.log(param, this.foo);  // this is undefined, based on how I invoke it
  }
}

我想这样做,一旦我得到用户输入...

let userInputMethod = 'myMethod';
let userInputParam = 'param';

const myInstance = new MyClass();
const method = myInstance[userInputMethod];
method(userInputParam);  // error, because I need somehow to set the context of this

你可以 bind

let userInputMethod = 'myMethod';
let userInputParam = 'param';

const myInstance = new MyClass();
const method = myInstance[userInputMethod].bind(myInstance)
method(userInputParam);

但那时候为什么不使用普通对象呢?

// foo.js
const foo = "bar";

const hey = {
  myMethod(param) {
    console.log(param, foo);
  },
};
//main.js
let userInputMethod = 'myMethod';
let userInputParam = 'param';

const method = hey[userInputMethod];
method(userInputParam);

如果您需要 class 接收数据,您可以像这样使用 closures

function makeInstance({ foo }) {
  return {
    myMethod(param) {
      console.log(param, foo);
    },
  };
}

this 上下文丢失,您需要 bind 它。

class MyClass {
  constructor() {
    this.foo = 'bar';
  }
  myMethod(param) {
    console.log(param, this.foo);
  }
}

let userInputMethod = 'myMethod';
let userInputParam = 'param';

const myInstance = new MyClass();
const method = myInstance[userInputMethod].bind(myInstance); // bind
method(userInputParam);

或者你可以使用箭头函数。

class MyClass {
  constructor() {
    this.foo = 'bar';
  }
  myMethod = (param) => {
    console.log(param, this.foo);
  }
}

let userInputMethod = 'myMethod';
let userInputParam = 'param';

const myInstance = new MyClass();
const method = myInstance[userInputMethod]
method(userInputParam);