Javascript:配置模式

问题 :Javascript函数需要很少的参数才能使用:

function kick(person, reason, amount) {
    // kick the *person* with the *amount*, based on the *reason*
}

由于在JS中无法像使用Java那样进行函数重载,所以如果需要将其设计用于将来的轻松改进(参数添加),则可以将其编写为:

/* Function Parameters pattern */
function kick() {
    // kick the person as in *arguments[0]*, with the amount as in *arguments[1]*,
    // based on the reason as in *arguments[2]*, with the strength as in *arguments[3]*
}

要么

/* Object Configuration Pattern */
function kick(config) {
    // kick the person as in *config.person*, with the amount as in *config.amount*,
    // based on the reason as in *config.reason*, with the strength as in *config.strength*
}

我知道对象配置模式允许对任何默认属性进行增强。

所以, 问题是:如果我不需要用参数来增加任何属性,是否有任何重要原因使用任何一种建议的解决方案而不是另一种?


使用对象有几个优点:

1.代码更具可读性

考虑以下两个调用:

kick({user: u,
      reason: "flood",
      log: true,
      rejoin: false,
      timeout: 60000,
      privmessage: true});

kick(u, "flood", true, false, 60000, true);

并想象别人正在读电话。 什么是第一个true ? 还要注意,你在几个月内会处于同一个确切的位置(不记得第四个kick参数与不知道它的非常相似)。

2.您可以隧道参数

通过对象方法,您可以传递函数一组参数,该函数必须使用该参数来调用另一个函数

function kickgroup(users, parms) {
    for (var i=0; i<users.lenght; i++) {
        var uparms = Object.create(parms);
        uparms.user = users[i];
        kick(uparms);
    }
}

请注意,在arguments情况下,您不需要使用arguments[x]语法来惩罚自己。 您可以声明参数并在函数发展时添加它们:任何未传递的参数将被设置为undefined (如果需要,仍然可以访问arguments.length以区分调用程序是否显式地传递了undefined的函数)。


你不必严格执行这三项任何一项。 如果你看看jQuery是怎么做的,它会检查参数的类型和数量以及位置,从而找出正在使用的函数的重载风格。

假设你有三种风格的kick() ,一种是接受人,理性和数量的方法,另一种方法是只需要具有理由和数量的人获取默认值,另一种方法是获取至少一个人的配置对象。 你可以动态地看到你有三个选项中的哪一个:

function kick(person, reason, amount) {
    if (person.person) {
       // must be an object as the first parameter
       // extract the function parameters from that object
       amount = person.amount;
       reason = person.reason;
    }
    amount = amount || 5;           // apply default value if parameter wasn't passed
    reason = reason || "dislike";   // apply default value if parameter wasn't passed
    // now you have person, reason and amount and can do normal processing
    // you could have other parameters too
    // you just have to be to tell which parameter is which by type and position

    // process the kick here using person, reason and amount
}

JavaScript函数仅由其名称签名。

因此你可以这样做:

  function kick(x, reason, amount) {
      if(reason && amount) {
          // do stuff with x as person, reason and amount
      }
      else if(x) {
          // do stuff with x as config
      }
      else {
         // do stuff with no parameters
      }

    }

另一个解决方案是使用参数变量,它是一个数组,其中包含所有传递给javascript函数的参数

   function kick() {
            alert(arguments.length);
   }
链接地址: http://www.djcxy.com/p/51991.html

上一篇: Javascript: Configuration Pattern

下一篇: Overloaded function in classic asp JScript