Javascript динамически вызывает метод объекта из строки


96

Могу ли я динамически вызывать метод объекта, имеющий имя метода в виде строки? Я представляю это так:

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

Ответы:


213

если имя свойства хранится в переменной, используйте []

foo[method]();

2
у меня не работает использование переменной внутри функции: const genericResolver = (table, action, values) => {return Auth.isAuthenticated () .then (() => {return eval (table) .findAll ()
stackdave

Если вы хотите выполнить метод из другого метода внутри класса, используйте этот ['methodName'] ().
schlingel 03

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

метод может быть вызван с помощью eval, eval("foo." + method + "()"); возможно, это не очень хороший способ.


Полезно в моем случае, где fooесть { fields: [{ id: 1 }] }и methodесть fields[0]?.id, но мне пришлось удалить ()из предложенного вами ответа
Роррим

4

Когда мы вызываем функцию внутри объекта, нам нужно указать имя функции в виде String.

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

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

2
Всегда полезно давать комментарии к вашему коду, чтобы его можно было понять вне контекста.
Фил Купер

Добавил комментарий. Благодарность!
вс,

0

Я хотел бы оставить здесь пример. Например; Я хочу вызвать метод динамической проверки при отправке формы.

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