Supongamos que tengo el siguiente código de clase de JavaScript. (EDITAR: el código se ejecuta como un módulo ES6 que se importa utilizando la declaración de "importación" estándar de ES6. Por lo tanto, la siguiente clase está en un archivo independiente "C.js")
export class C { static f() { console.log("hello world") } }Ahora quiero importar el módulo e invocar el método Cf(), pero solo tengo el nombre del método como una cadena. Lo siguiente funciona bien:
import {C} from "C.js" var methodName="f" C[methodName]()Ahora supongamos que también tengo el nombre de la clase como una cadena de la siguiente manera:
import {C} from "C.js" var className="C" var methodName="f" /* How do I invoke Cf() ? */Cosas que he probado:
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]()He intentado usar el constructor Function():
import {C} from "C.js" var className="C" var methodName="f" /* the following does NOT work: */ var fn = new Function(className+"."+methodName+"()") fn()El código anterior da un error de que "C" no está definida, cuando se ejecuta fn().
También intenté usar "eval ()", que sería mi última opción de todos modos, ya que realmente no necesito evaluar el código "arbitrario". Solo quiero ejecutar un método estático en una clase, cuyos nombres están en cadenas.
import {C} from "C.js" var className="C" var methodName="f" var code = className + "." + methodName + "()" eval(code)Lo anterior NO funciona en el navegador web Chrome como parte de una aplicación JavaScript ES6 moderna. El problema en el navegador web Chrome es que el "entorno" global utilizado dentro de "eval" NO ve la definición de clase "C".
Entonces, ¿cuál es la mejor manera de implementar esta simple llamada usando valores de cadena para el nombre de la clase y el nombre del método?
import {C} from "C.js" var className="C" var methodName="f" /* now what? */Dado que la respuesta está enterrada en los comentarios de la pregunta, pensé que debería continuar y publicarla aquí como una respuesta real, para que los futuros espectadores puedan encontrar la respuesta fácilmente.
La respuesta es: en JavaScript, no es posible invocar un método en una clase que se cargó desde un módulo ES6, donde el nombre de la clase está en una cadena.