为什么传递包装在对象中的参数?

时间:2011-02-22 20:43:42

标签: javascript coding-style prototypejs

javascript库(如Prototype)如何决定何时编写接受一系列参数的函数或只接受一个巨大的对象?以下是两者的例子。每个人的利弊都很平衡,所以我不明白何时使用一种方法或另一种方法。

对象

new Ajax.Request(
 'server.php', {
  onSuccess: function() {
   console.info('I succeeded');
  },
  onFailure: function() {
   console.info('I failed');
  }
);

优点:对象中参数的顺序无关紧要。当您忘记参数的顺序时,您不必检查函数定义。此外,当其他人阅读该功能的调用时,他们会更好地了解您正在做的事情。想象一下,如果Ajax调用是这样的:

new Ajax.Request(
 'server.php', 
  function() {
   console.info('mystery function');
  },
  function() {
   console.info('is this success or failure?');
  }
);

缺点:功能标题没有清楚地显示需要传递的内容。您被迫保持评论的最新状态。

// unclear what options need to be passed in without comments
Ajax = {
 Request: function(url, options) {
 }
};

// a little clearer
Ajax = {
 Request: function(url, successCallback, failureCallback) {
 }
};

正常

new PeriodicalExecuter(
 function(myself) {
  console.info('I am running');
 },
 1
);

优点:功能定义不需要评论让人们快速掌握参数。

缺点:参数的顺序很重要。指定默认值更难:

// dirty
PeriodicalExecuter = function(callback, period) {
 if (typeof(callback) === 'undefined') {
  callback = Prototype.emptyFunction;
 }
 if (typeof(period) === 'undefined') {
  period = 1;
 } 
};

// clean 
PeriodicalExecuter = function(options) {
 var myOptions = {callback: Prototype.emptyFunction, period: 1};
 Object.extend(myOptions, options);
};

1 个答案:

答案 0 :(得分:5)

当有许多“可选”参数时,我倾向于更容易找到对象。也就是说,如果你只想覆盖,比如,可用于覆盖的众多选项中的2个,那么对象是最好的,恕我直言。 (jQuery的.ajax函数就是一个很好的例子)。如果你只处理1-3个选项,那么参数似乎是有意义的,因为它明确哪些参数可以做什么。 (例如,JavaScript中内置的替换函数)

没有什么比试图解析参数列表测试哪个参数匹配哪个功能(oops,参数3是一个函数,它们必须意味着这是回调参数,而不是默认颜色参数,例如)