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();

Respostas:


211

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

foo[method]();

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"

3

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


Ú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

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;
    }
};
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.