Javascript динамічно викликає метод об'єкта з рядка


94

Чи можу я динамічно викликати об'єктний метод, що має ім'я методу як рядок? Я б уявив це так:

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

Відповіді:


212

якщо ім'я властивості зберігається у змінній, використовуйте []

foo[method]();

1
це не працює для мене із використанням змінної всередині функції: const genericResolver = (table, action, values) => {return Auth.isAuthenticated (). then (() => {return eval (table) .findAll ()
stackdave

Якщо ви хочете виконати метод з іншого методу всередині класу, використовуйте цей ['methodName'] ().
schlingel

2
Появляється ця потворна помилка Element implicitly has an 'any' type because expression of type 'string' can't be used to index type 'FooClass'ще комусь
Anand Rockzz

33

Властивості об'єктів можна отримати через позначення масиву:

var method = "smile";
foo[method](); // will execute the method "smile"

4

Коли ми викликаємо функцію всередині об'єкта, нам потрібно вказати назву функції як String.

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

obj['talk'](); //prints "Hi"
obj[talk]()// Does not work

2
Завжди корисно надати якийсь коментар до свого коду, щоб його можна було зрозуміти поза контекстом.
Філ Купер,

Додав коментар. Дякую!
сн

3

метод можна викликати за допомогою eval, eval("foo." + method + "()"); можливо, не дуже хороший спосіб.


Корисно в моєму випадку, де fooє { fields: [{ id: 1 }] }і methodє fields[0]?.id, але мені довелося видалити ()із запропонованої вами відповіді
Роррім,

-1

Я хотів би залишити тут приклад для цього. Наприклад; я хочу викликати метод динамічної перевірки під час надсилання форми.

<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;
    }
};
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.