Мастер-классы по Javascript Екатеринбург Ростов-на-Дону Москва Узнать больше...
Содержание (скрыть) Содержание (показать)

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

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

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

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

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

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

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

Еще один способ — скопировать все свойства в локальные переменные.

Как решить проблему без копирования, с использованием наследования?

Решение
Решение

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

function inherit(proto) {
  function F() {}
  F.prototype = proto;
  return new F;
}

function Menu(options) {
  var opts = inherit(options);
  opts.width = opts.width || 300;

  alert(opts.width);  // возьмёт width из opts
  alert(opts.height); // возьмёт height из options
  ...
}

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

P.S. При этом нельзя удалять параметры. Вызов delete opts.height никак не повлияет на возможность получить opts.height, если это свойство находится в исходном объекте.

#276
Наверх

Реклама

Нашли опечатку?

Нашли опечатку на сайте? Что-то кажется странным?
Выделите соответствующий текст и нажмите Ctrl+Enter!

Последние Комментарии

Помоги другим!

Помоги другим узнать о хорошей статье!