Есть функция 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, если это свойство находится в исходном объекте.