代码之家  ›  专栏  ›  技术社区  ›  superachu

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

  •  6
  • superachu  · 技术社区  · 15 年前

    我很熟悉jquery。我正在尝试为自己的目的编写通用的方法。下面是一个示例:

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

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

    3 回复  |  直到 13 年前
        1
  •  15
  •   Christian C. Salvadó    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语言特性(如闭包、函数应用程序等)来模拟 方法重载 以下内容:

        2
  •  3
  •   alex    15 年前

    我认为这将用您定义的第二个“添加”属性覆盖第一个“添加”属性。这在开发插件时很有用,并且希望为配置对象提供一个合理的默认值列表。

        3
  •  0
  •   Eli Sand    13 年前

    如果向函数传递的参数少于定义要接受的参数,则JavaScript不会引发错误。

    您可以使用在函数中使用“arguments”设置的变量参数,也可以像在第二条语句中那样定义函数(使用3个参数),然后简单地检查第三个参数是否未定义。如果未提供参数,则将其设置为未定义,您可以简单地检查(它与空值不同),这可能比使用Arguments对象更简单。