Javascript invoca dinamicamente o método do objeto a partir da string

94

Posso chamar dinamicamente um método de objeto com o nome do método como uma string? Eu imaginaria assim:

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
fonte

Respostas:

211

se o nome da propriedade estiver armazenado em uma variável, use []

foo[method]();
Karoly Horvath
fonte
1
não está funcionando para mim usando uma variável dentro de uma função: const genericResolver = (tabela, ação, valores) => {return Auth.isAuthenticated () .then (() => {return eval (tabela) .findAll ()
stackdave
Se você quiser executar um método de outro método dentro de uma classe, use este ['methodName'] ().
Schlingel
2
Está recebendo esse erro feio de Element implicitly has an 'any' type because expression of type 'string' can't be used to index type 'FooClass'mais alguém?
Anand Rockzz
33

As propriedades dos objetos podem ser acessadas por meio da notação de matriz:

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

método pode ser chamado com eval eval("foo." + method + "()"); pode não ser uma maneira muito boa.

Hakovala
fonte
Útil no meu caso onde fooestá { fields: [{ id: 1 }] }e methodestá fields[0]?.id, mas tive que remover ()de sua resposta proposta
Rorrim
3

Quando chamamos uma função dentro de um objeto, precisamos fornecer o nome da função como String.

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

obj['talk'](); //prints "Hi"
obj[talk]()// Does not work
sn
fonte
2
É sempre útil fornecer alguns comentários com seu código para que possa ser entendido fora do contexto.
Phil Cooper
Adicionado algum comentário. Obrigado!
sn
-1

Eu gostaria de deixar um exemplo aqui para isso. Por exemplo; Eu quero chamar um método de verificação dinâmica ao enviar o formulário.

<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
fonte