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.