Вернуться к уроку

Аргументы по умолчанию

важность: 4

Есть функция Menu, которая получает аргументы в виде объекта options:

/* options содержит настройки меню: width, height и т.п. */
function Menu(options) {
  ...
}

Ряд опций должны иметь значение по умолчанию. Мы могли бы проставить их напрямую в объекте options:

function Menu(options) {
  options.width = options.width || 300; // по умолчанию ширина 300
  ...
}

…Но такие изменения могут привести к непредвиденным результатам, т.к. объект options может быть повторно использован во внешнем коде. Он передается в Menu для того, чтобы параметры из него читали, а не писали.

Один из способов безопасно назначить значения по умолчанию – скопировать все свойства options в локальные переменные и затем уже менять. Другой способ – клонировать options путём копирования всех свойств из него в новый объект, который уже изменяется.

При помощи наследования и Object.create предложите третий способ, который позволяет избежать копирования объекта и не требует новых переменных.

Можно прототипно унаследовать от options и добавлять/менять опции в наследнике:

function Menu(options) {
  options = Object.create(options);
  options.width = options.width || 300;

  alert( options.width ); // возьмёт width из наследника
  alert( options.height ); // возьмёт height из исходного объекта
  ...
}

Все изменения будут происходить не в самом options, а в его наследнике, при этом исходный объект останется незатронутым.