У меня есть codepen, представляющий мой вопрос: http://codepen.io/anon/pen/ibwvl
В кодепее я создаю несколько простых функций инициализации плагина и выхожу из настроек, когда приложение начинает работать.
Мой вопрос: когда я console.log(app.settings)
я вижу свой объект по умолчанию, вместе с новым объектом объектов, объединенным вместе, но я не вижу последний ключ внутри объекта default по умолчанию (foo3). Это потому, что объект по умолчанию перезаписывается объектом options при $.extend()
? Если да, можно ли объединить вложенные объекты с $.extend()?
Для ясности:
объект по умолчанию:
var defaults = {
test: 'foo',
obj: {
key1: null,
key2: null,
key3: 'foo3'
}
}
объект опций:
$('#foo').fooTest({
obj: {
key1: 'foo1',
key2: 'foo2'
}
});
результат при регистрации параметров app.settings
:
test: 'foo',
obj: {
key1: null,
key2: null
}
}
Куда key3
?
Была ли она перезаписана из-за плагина options, определяющего новый obj как obj: {}
?
Если да, то как я могу использовать расширение с вложенными объектами и гарантировать, что они не будут перезаписаны?
Да, объект переписывается. Но, к счастью, $.extend
принимает boolean как первый параметр, который допускает глубокое расширение.
Просто делать:
app.settings = $.extend(true, defaults, options); //this will override defaults
app.settings = $.extend(true, {}, defaults, options); //this will not
//app.settings will be the same with both way
Используйте deep
параметр функции jQuery.extend
. Это заставит функцию расширения работать рекурсивной.
app.settings = $.extend(true, {}, defaults, options);
Отсюда вы можете найти больше примеров о функции jQuery.extend
и ее использовании.
Но будьте осторожны, поскольку он добавлен в jQuery v1.1.4, и, как говорится в официальной документации, передача false
для первого аргумента не поддерживается.