Использование объектов в плагине jQuery по умолчанию

0

У меня есть 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: {}?

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

Теги:
javascript-objects
jquery-plugins
extend

2 ответа

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

Глубокое расширение

  • 0
    Тьфу, я даже посмотрел на пример в документах и пропустил там «истину». Спасибо за подробный ответ и за различные варианты. Я был смущен обоими ответами, у одного был аргумент {}, а у другого - нет, так что это проясняет его еще больше. Еще раз спасибо!
  • 0
    Мое удовольствие, вот для чего ТАК!
3

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

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

Отсюда вы можете найти больше примеров о функции jQuery.extend и ее использовании.

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

  • 0
    Спасибо за быстрый ответ!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню