Можно ли получить имена аргументов функции в JS?

Можно ли получить аргументы в виде массива, чтобы циклом создавать свойства для объекта?

function  Worker(name, surname, rate, days) {
    this.name = name;
    this.surname = surname;
    this.rate = rate;
    this.days = days;

    Worker.prototype.getSalary = function() {
      return days * rate
    }

    var array = Object.keys(this);

    for (var i = 0; i < array.length; i++) {
      Object.defineProperty(this, array[i], {
        writable: false,
        configurable: false
      });
    };
  }
  • Вопрос задан
  • 838 просмотров
Пригласить эксперта
Ответы на вопрос 1
Vlad_IT
@Vlad_IT Куратор тега JavaScript
Front-end разработчик
Аргументы хранятся в arguments.
UPD:
Имена аргументов можно получить костыльным методом. Тупо разбивая строку func.toString() Другого выхода вроде нет. Вот нагуглил такой код
function getArgs(func) {
  // First match everything inside the function argument parens.
  var args = func.toString().match(/function\s.*?\(([^)]*)\)/)[1];
 
  // Split the arguments string into an array comma delimited.
  return args.split(',').map(function(arg) {
    // Ensure no inline comments are parsed and trim the whitespace.
    return arg.replace(/\/\*.*\*\//, '').trim();
  }).filter(function(arg) {
    // Ensure no undefined values are added.
    return arg;
  });
}
// Пример
function a(b,c) { }
getArgs(a); // ['b', 'c']

Можете объединить этот код с arguments, чтобы получать и имена и значения.
function  Worker(name, surname, rate, days) {
    var names = getArgs(Worker);
    for (var i = 0; i < names.length; i++) {
       var name = names[i];
       var value = arguments[i];
       console.warn(name, value); // Выведет имя аргумента и его значение. 
       // Значение будет undefined если оно не будет передано 
    };
  }

Но это тупо, т.к. аргументы имеют имена только в том случае, если они явно объявлены, иначе они просто имеют индекс в arguments. Для этих задач лучше использовать объект.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы