Это зависит от того, в какой степени вы хотите это сделать. Идея заключалась бы в создании функции проверки, которая принимает отображение argument -> rule
. E.g.:
function foo(somestring, somenumber) {
var rules = {
'somestring': Validator.rules.isString,
'somenumber': Validator.rules.inRange(5,10);
};
}
Validator
будет содержать базовую логику и некоторые вспомогательные функции (правила):
var Validator = {
valid: function(args, rules) {
for(var name in rules) {
if(!rules[name](args[name])) {
return false;
}
}
return true;
},
rules: {
isString: function(arg) {
return (typeof arg === 'string');
},
inRange: function(x,y) {
return function(arg) {
return !isNaN(+arg) && x <= arg && arg <= y;
}
}
}
}
Это просто набросок , он, безусловно, может быть расширен (например, принимая несколько правил на аргумент), но он должен дать вам некоторое представление.
Тем не менее, вам не нужно проверять каждый аргумент. Предоставить достойную документацию. Если люди используют ваш плагин неправильно, то есть передают неверные типы аргументов, тогда ваш код все равно выдаст ошибку.
Обновление:
Если вы хотите делать это очень часто, то хорошей идеей будет написать функцию-обертку, и вы просто передадите ей функцию и правила:
function ensure(func, rules, context) {
context = context || this;
return function() {
if(Validator.valid(arguments, rules)) {
return func.apply(context, arguments);
}
return null; // or throw error, whatever you want
}
}
Тогда вы можете определить свою функцию как обычно:
var foo = function(somestring, somenumber) {
// ...
};
и просто добавьте к нему подтверждение:
var rules = {...};
foo = ensure(foo, rules);
Вы могли бы даже сделать так, чтобы ensure
принимал обратный вызов, который вызывается при ошибке или успешном завершении функции вместо возврата значения. Есть много возможностей.