Аргументы по умолчанию
Есть функция 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 = 300;
alert("width: " + options.width); // возьмёт width из наследника
alert("height: " + options.height); // возьмёт height из исходного объекта
}
var options = {
width: 100,
height: 200
};
var menu = new Menu(options);
alert("original width: " + options.width); // width исходного объекта
alert("original height: " + options.height); // height исходного объекта
Все изменения будут происходить не в исходном options
, а в его наследнике, при этом options
останется незатронутым.