Javascript invoca dinámicamente el método de objeto desde una cadena

94

¿Puedo llamar dinámicamente a un método de objeto que tiene el nombre del método como una cadena? Me lo imagino así:

var FooClass = function() {
    this.smile = function() {};
}

var method = "smile";
var foo = new FooClass();

// I want to run smile on the foo instance.
foo.{mysterious code}(); // being executed as foo.smile();
Mikulas Dite
fuente

Respuestas:

212

si el nombre de la propiedad está almacenado en una variable, use []

foo[method]();
Karoly Horvath
fuente
1
no me funciona usando una variable dentro de una función: const genericResolver = (tabla, acción, valores) => {return Auth.isAuthenticated (). then (() => {return eval (table) .findAll ()
stackdave
Si desea ejecutar un método desde otro método dentro de una clase, use este ['nombreMétodo'] ().
schlingel
2
¿Recibiendo este feo error a Element implicitly has an 'any' type because expression of type 'string' can't be used to index type 'FooClass'alguien más?
Anand Rockzz
33

Se puede acceder a las propiedades de los objetos a través de la notación de matriz:

var method = "smile";
foo[method](); // will execute the method "smile"
Didier Ghys
fuente
4

Cuando llamamos a una función dentro de un objeto, necesitamos proporcionar el nombre de la función como una Cadena.

var obj = {talk: function(){ console.log('Hi') }};

obj['talk'](); //prints "Hi"
obj[talk]()// Does not work
sn
fuente
2
Siempre es útil proporcionar algún comentario con su código para que pueda entenderse fuera de contexto.
Phil Cooper
Agregó algún comentario. ¡Gracias!
sn
3

El método que se puede llamar con eval eval("foo." + method + "()"); podría no ser muy bueno.

hakovala
fuente
Útil en mi caso donde fooestá { fields: [{ id: 1 }] }y methodes fields[0]?.id, pero tuve que eliminarlo ()de su respuesta propuesta
Rorrim
-1

Me gustaría dejar aquí un ejemplo para esto. Por ejemplo; Quiero llamar a un método de verificación dinámica al enviar el formulario.

<form data-before-submit="MyObject.myMethod">
    <button type="submit">Submit</button>
</form>
$('form').on('submit', function(e){

    var beforeSubmit = $(this).attr('data-before-submit');

    if( beforeSubmit ){

       params = beforeSubmit.split(".");
       objectName = params[0];
       methodName = params[1];

       result = window[objectName][methodName]($(this));

       if( result !== true ){
           e.preventDefault();
       }

    }

});
var MyObject = {
    myMethod = function(form){
        console.log('worked');
        return true;
    }
};
ahmeti
fuente