Javascript: как динамически вызывать метод и динамически устанавливать параметры для него - PullRequest
0 голосов
/ 28 июня 2019

Я пытаюсь проверить в javascript, может динамически вызывать метод и динамически устанавливать параметры для него.

let obj = {
  method: 'foo1',
  params: ['one', 'two']
}

foo 1(p1, p2) {
 // do something
}

Для запуска =>

[obj.method](obj.params)

Есть ли способ динамически добавлять параметры из массива.

Ответы [ 3 ]

3 голосов
/ 28 июня 2019

Да - распространение (ES6):

window[obj.method](...obj.params);

Убедитесь, что вы правильно обращаетесь к функции - если вы объявите ее с var в глобальной области видимости, она будет привязана к window. Если нет, он вообще не будет доступен (строка eval, и это плохая практика).

2 голосов
/ 28 июня 2019

Вам понадобится, чтобы функция существовала как метод объекта, затем вы можете вызывать ее динамически с помощью скобочной нотации [] и передавать имя метода в виде строки в скобках в качестве индекса.Затем вы будете использовать оператор распространения ..., чтобы объединить массив параметров в список с разделителями.

Другие показали это с глобальным window в качестве родительского объекта, но (как мы знаем) глобальныекак правило, плохо, поэтому просто создайте свой собственный.

Ниже я показываю несколько методов и вариантов выбора параметров и прошу пользователя указать, какую комбинацию он хочет.Конечно, этот ввод может быть обработан многими другими способами.

// The methods must be stored in an object so that they can be accessed with
// bracket notation later.
let obj = {
  method1: function foo1(p1, p2) {
            console.log("method1 was called with: ", arguments);
  },
  method2: function foo1(p1, p2) {
            console.log("method2 was called with: ", arguments);
  },
  params1: ['one', 'two'],
  params2: ['three', 'four'],  
};

// Get the user's desired invocation requirements:
let choice = prompt("Enter 'method1' or 'method2'");
let args = prompt("Enter 'params1' or 'params2'");

// Pass the method name (as a string) into the object to extract the
// value of that property. Then invoke it with () and look up the correct
// parameter property in the same way. Flatten the parameter array with the
// spread operator (...).
obj[choice](...obj[args]);
2 голосов
/ 28 июня 2019

Для вызова функции по имени строки:

window[obj.method](...obj.params)

Пример:

let obj = {
    method: 'foo1',
    params: ['one', 'two']
}

function foo1(p1, p2) {
    console.log(p1, p2)
}

window[obj.method](...obj.params) // result: one two
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...