我可以使用jQuery.extend来模拟方法重载吗?

时间:2009-10-23 04:28:00

标签: javascript jquery

我对jQuery非常熟悉。我正在尝试为自己的目的编写常用方法。以下是一个示例:

$.extend({
    add  : function(a, b)
           {
             return a + b;
           },

    add  : function(a, b, c)
           {
             return a + b + c;
           }
   });

上述情况是否可行?我可以使用相同的扩展名称并传递不同的参数,例如方法重载吗?

3 个答案:

答案 0 :(得分:15)

您正试图在某些语言方法重载中执行某些类型的调用。

JavaScript不支持它。

JavaScript非常通用,可让您以不同的方式实现此类功能。

对于您的特定示例,您的add函数,我建议您使用arguments对象创建一个接受任意数量参数的函数。

jQuery.extend(jQuery, {
  add: function (/*arg1, arg2, ..., argN*/) {
    var result = 0;

    $.each(arguments, function () {
      result += this;
    });

    return result;
  }
});

然后你可以传递任意数量的参数:

alert(jQuery.add(1,2,3,4)); // shows 10

对于更复杂的方法重载,您可以检测传递的参数数量及其类型,例如:

function test () {
  if (arguments.length == 2) { // if two arguments passed
    if (typeof arguments[0] == 'string' && typeof arguments[1] == 'number') {
      // the first argument is a string and the second a number
    }
  }
  //...
}

检查以下文章,它包含一个非常有趣的技术,利用一些JavaScript语言功能,如闭包,函数应用程序等,来模仿方法重载

答案 1 :(得分:3)

我认为只会使用您定义的第二个'add'属性覆盖第一个'add'属性。这在开发插件时很有用,并且想要为配置对象提供合理的默认值列表。

答案 2 :(得分:0)

如果向函数传递的参数少于定义为接受的参数,则JavaScript不会抛出错误。

您可以使用“arguments”在函数中使用变量参数设置,或者您可以像在第2个语句中使用3个参数一样定义函数,并只检查第3个参数是否未定义。如果没有提供参数,则将其设置为undefined,您可以简单地检查它(它与null不同),这可能比必须使用arguments对象更简单。