2014-02-19 4 views
0

Я с codepen, представляющий мой вопрос: http://codepen.io/anon/pen/ibwvlИспользование объектов Внутри на Jquery Plugin Defaults

В codepen, я создаю некоторые простые функции плагин инициализации и выйти из настроек, когда приложение начинает работать.

Мой вопрос: когда я 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 go?

Был ли он перезаписан из-за плагина параметров, определяющего новый объект, как obj: {}?

Если да, то как я могу использовать расширение с вложенными объектами и гарантировать, что они не будут перезаписаны?

ответ

2

Да, вы обременяете объект. Но, к счастью, $.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 extension

+0

Ух, я даже посмотрел на пример в документах и ​​пропустил «истину» там. Спасибо за подробный ответ и за различные варианты. Я был смущен обоими ответами, у одного был {} arg, а другой - нет, так что это еще больше очистило его. Еще раз спасибо! – spez86

+0

Мое удовольствие, вот что ТАК! –

3

Используйте deep параметр функции jQuery.extend. Это заставит функцию расширения работать рекурсивной.

app.settings = $.extend(true, {}, defaults, options); 

From here, вы можете найти больше примеров о jQuery.extend функции и ее использования.

Но будьте осторожны, поскольку он добавлен в jQuery v1.1.4, и, как говорится в официальной документации, передача false для первого аргумента не поддерживается.

+0

Благодарим вас за ответ так быстро! – spez86

Смежные вопросы