Я предпочитаю проверку == null
вместо typeof(arg1) === undefined
(как внутренне делает библиотека jQuery: http://docs.jquery.com/JQuery_Core_Style_Guidelines#JSLint). Мало того, что она более краткая, она также обрабатывает как null, так и undefined, так что клиентский код может пройтив null
и получите применение по умолчанию.
Также возможно заключить функцию в другую функцию, которая предоставляет значения по умолчанию. Библиотека prototypejs имеет функцию, которая предоставляет argumentNames()
(или, если вы этого не сделаетеЕсли вы хотите использовать прототип, вы можете просто позаимствовать реализацию - это просто регулярное выражение, примененное к результатам toString()
) функции.
Таким образом, вы можете сделать что-то вроде этого:
var Foo = defaults(Foo, { arg1: 50, arg2: 'default' });
function Foo(arg1, arg2) {
//...
}
И реализация defaults()
будет выглядеть примерно так:
function defaults(fn, def) {
return function() {
var arg_names = fn.argumentNames();
var nArgs = args.length;
for (var nArg = 0; nArg < nArgs; ++nArg) {
if (arguments[nArg] == null && arg_names[nArg] in def)
arguments[nArg] = def[arg_names[nArg]];
}
fn.apply(this, arguments);
}
}
Конечно, это непроверенный код и способ его написания, для него требуется библиотека Prototype. Но все, что сказано, == null
подход внутри функции более естественен для Javascript, его легче отлаживать (у вас нет другого функционального слоя для перехода по нему), и мне легче читать:
function Foo(arg1, arg2) {
if (arg1 == null) arg1 = 50;
if (arg2 == null) arg2 = 'default';
}