当class名称和方法名称是字符串时,如何调用JavaScript静态class方法?

How to call a JavaScript static class method when the class name and method name are strings?

假设我有以下 JavaScript class 代码。 (编辑:代码 运行 作为使用标准 ES6“导入”语句导入的 ES6 模块。因此以下 class 在独立文件“C.js”中)

export class C {
    static f() {
        console.log("hello world")
    }
}

现在我想导入模块并调用方法 C.f(),但我只有字符串形式的方法名称。以下工作正常:

import {C} from "C.js"
var methodName="f"
C[methodName]()

现在假设我也有 class 作为字符串的名称,如下所示:

import {C} from "C.js"
var className="C"
var methodName="f"
/* How do I invoke C.f() ? */

我尝试过的事情:

import {C} from "C.js"
var className="C"
var methodName="f"
/* none of the below calls work */
window[className][methodName]()
self[className][methodName]()
globalThis[className][methodName]()

我试过使用 Function() 构造函数:

import {C} from "C.js"
var className="C"
var methodName="f"
/* the following does NOT work: */
var fn = new Function(className+"."+methodName+"()")
fn()

上面的代码在执行 fn() 时给出了“C”未定义的错误。

我也尝试过使用“eval()”,无论如何这是我最后的选择,因为我真的不需要评估“任意”代码。我只想在 class 中执行一个静态方法,其名称在字符串中。

import {C} from "C.js"
var className="C"
var methodName="f"
var code = className + "." + methodName + "()"
eval(code)

以上内容作为现代 ES6 JavaScript 应用程序的一部分在 Chrome 网络浏览器中不起作用。 Chrome 网络浏览器中的问题是“eval”中使用的全局“环境”看不到“C”class 定义。

那么,使用 class 名称和方法名称的字符串值来实现这个非常简单的调用的最佳方法是什么?

import {C} from "C.js"
var className="C"
var methodName="f"
/* now what? */

由于答案隐藏在问题的评论中,我想我应该继续post这里作为实际答案,以便未来的观众可以轻松找到答案。

答案是:在 JavaScript 中,无法调用从 ES6 模块加载的 class 中的方法,其中 class 的名称位于一个字符串。