使用字符串调用方法(不是函数)
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);
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);