Рассматриваемый тут приём может использоваться при создании любых функций, имеющих необязательные параметры, но особенно он актуален при создании плагинов, поскольку плагин предназначен для широкого круга разработчиков, и им нужно предоставить удобный и понятный API.
В PHP у нас такой проблемы бы не возникло, так как там есть параметры по умолчанию. В Java – тоже, так как там можно перегружать методы с различными наборами параметров. Остаётся лишь вздохнуть: “Хорошую религию придумали индусы”. Хотя, если подумать: а нам оно надо – писать перегруженные методы на все случаи жизни, когда можно очень компактно и с минимальными потерями для читабельности кода уместить всё в одной функции! Что касается параметров по умолчанию, то они легко реализуются и в JavaScript. Примерно так:
1 2 3 4 5 6 |
function myfunc(param1, param2, param3, param4) { var param2 = param2 || true; var param3 = param3 || 'default value'; var param4 = param4 || 10; ... } |
И вызывать как-то так:
1 |
myfunc('Петров', null, null, 11) ; |
Понятно, что это не то, что вы назвали бы удобным API, поэтому — “мы пойдём другим путём”. Ну, а если вам нужны продающие тексты на сайт, то посетите e-art.com.ua, там работают хорошие ребята и они помогут вывести ваш сайт в ТОП. А теперь продолжим...
Итак, в чём состоит предлагаемый способ, и что, в данном случае, может предложить нам jQuery. В основе его старая как мир идея: упаковка параметров в объект. Каждый параметр представлен как свойство объекта; теперь у него есть имя, и порядок следования параметров нас больше не волнует. А для реализации необязательности параметров мы воспользуемся встроенной функцией jQuery extend, в которую первым параметром передадим объект, заполненный значениями по умолчанию, а вторым — переданный в функцию объект с фактическими значениями параметров. Функция extend сливает оба объекта в один, заменяя значения одноимённых свойств первого объекта, значениями второго, если они есть. Если объект не определён, то он заменяется пустым объектом, благодаря конструкции || {}
.
1 2 3 4 5 6 7 8 |
function myfunc(param1, params) { var options = $.extend({ param2: true, param3: 'default value', param4: 10 }, params || {}); ... } |
Вот, собственно, и всё. На радостях, оформляем нашу функцию как плагин jQuery:
1 2 3 4 5 6 7 8 9 10 |
(function($) { $.fn.myfunc = function(param1, params) { var options = $.extend({ param2: true, param3: 'default value', param4: 10 }, params || {}); ... } })(jQuery); |
Программисту, использующему нашу функцию или плагин, больше не придётся считать параметры и передавать null-ы, когда он не хочет передавать ничего.