javascript - 为什么要传递包裹在对象中的参数?

标签 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);
};

最佳答案

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

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

关于javascript - 为什么要传递包裹在对象中的参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5083739/

相关文章:

python - 如何干净地要求用户输入并允许多种类型?

javascript - 你如何干净地删除 Prototype JS 中的 DOM 元素?

javascript - 如何处理原型(prototype)上的 "left"和 "right"键?

javascript - 使用 JavaScript Prototype 库循环遍历所有选择元素

javascript - console.log启用验证之间的区别

javascript - jQuery 函数(调整窗口大小)

c - c的良好OO命名方案

c# - WPF,将代码直接放在InitializeComponent之后的错误做法?

javascript - JavaScript 的 Date 对象容易受到 Y2038 问题的影响吗?

javascript - Ajax回调中的if语句