簡體   English   中英

JavaScript static 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() ? */

我嘗試過的事情:

  • 使用不起作用的 window/self/globalThis:
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 中執行一個 static 方法,其名稱是字符串。

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

作為現代 ES6 JavaScript 應用程序的一部分,以上內容在 Chrome web 瀏覽器中不起作用。 Chrome web 瀏覽器中的問題是“eval”中使用的全局“環境”看不到“C”class 定義。

那么,使用 class 名稱和方法名稱的字符串值來實現這個非常簡單的調用的最佳方法是什么?

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

由於答案隱藏在問題的評論中,我想我應該提前 go 並將其作為實際答案發布在這里,以便未來的觀眾可以輕松找到答案。

答案是:在 JavaScript 中,不可能調用從 ES6 模塊加載的 class 中的方法,其中 class 的名稱是一個字符串。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM