В следующей демонстрации: что происходит в этой строке кода?
settings = $.extend({}, defaultSettings, settings || {});
В чем разница между вышеуказанным и этим:
if(settings){
settings = $.extend(defaultSettings, settings);
}
==================================
(function($){
var defaultSettings = {
mode : 'Pencil',
lineWidthMin : '0',
lineWidthMax : '10',
lineWidth : '2'
};
$.fn.wPaint = function(settings)
{
settings = $.extend({}, defaultSettings, settings || {});
return this.each(function()
{
var elem = $(this);
//run some code here
});
}
})(jQuery);
settings = $.extend({}, defaultSettings, settings || {});
Метод jQuery $.extend() копирует свойства из одного или нескольких объектов друг в друга, справа налево. В этом конкретном примере методу передаются три объекта: {}
(пустой объект), defaultSettings
и затем settings
(или пустой объект, если settings
не существуют). Итак, переходя справа налево, все свойства настроек будут скопированы в defaultSettings
а затем результат будет скопирован в пустой объект ({}
). Результатом всего этого является то, что свойства в settings
(которые являются пользовательскими параметрами пользователя) будут иметь приоритет перед defaultSettings
по defaultSettings
а затем все они будут скопированы в пустой объект. Причина для пустого объекта заключается в том, что $.extend() фактически модифицирует первый аргумент по ссылке, поэтому передача в пустой объект, поскольку первый объект по существу делает клон без изменения какого-либо объекта.
if(settings){
settings = $.extend(defaultSettings, settings);
}
Это делает то же самое, за исключением того, что вместо замены settings
пустым объектом, если он не существует, он просто не выполняет заданный код.
ОБНОВЛЕНИЕ: Что касается settings || {}
settings || {}
, это означает использование объекта настроек, если он существует (технически, если он правдивый) ИЛИ использовать пустой объект. Это позволяет избежать передачи undefined
.
undefined
ничего не меняет в объединенном / конечном объекте, так что settings || {}
не требуется