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.