Ничего себе .. это первое сообщение StackOverflow, которое я видел с несколькими страницами. Извинения за добавление еще одного "ответа"
Этот метод предназначен для ES5 и ранее - есть много других ответов, касающихся ES6.
Я не видел никакого «глубокого» слияния объекта с использованием arguments
свойства. Вот мой ответ - компактный и рекурсивный , позволяющий передавать неограниченные аргументы объекта:
function extend() {
for (var o = {}, i = 0; i < arguments.length; i++) {
// if (arguments[i].constructor !== Object) continue;
for (var k in arguments[i]) {
if (arguments[i].hasOwnProperty(k)) {
o[k] = arguments[i][k].constructor === Object ? extend(o[k] || {}, arguments[i][k]) : arguments[i][k];
}
}
}
return o;
}
Часть, которая закомментирована, является необязательной. Она просто пропускает переданные аргументы, которые не являются объектами (предотвращая ошибки).
Пример:
extend({
api: 1,
params: {
query: 'hello'
}
}, {
params: {
query: 'there'
}
});
// outputs {api: 1, params: {query: 'there'}}
Этот ответ теперь - только падение в океане ...