【问题标题】:overloaded methods重载方法
【发布时间】:2011-11-23 17:11:45
【问题描述】:
function Activity() {

this.LoadFile = function (path, targetElement) {

    $.ajax({
        url: path,
        dataType: 'html',
        success: function (data) {
            targetElement.html(data);
        }

    });
};

this.LoadFile = function (path, targetElement, onSuccess) {

    $.ajax({
        url: path,
        dataType: 'html',
        success: function (data) {
            targetElement.html(data);
            onSuccess(data);
        }

    });
};

}

如果我尝试传递 2 个参数,我会得到 onSuccess is not a function 所以我想这不起作用。是否可以在 javascipt 中使用重载?

【问题讨论】:

    标签: javascript overloading


    【解决方案1】:

    在 JS 中无法直接指定重载方法。

    许多解决方法。

    在您的情况下,您可以使用 3 个参数定义函数:

    function (path, targetElement, onSuccess)
    

    如果函数仅使用 2 个参数调用,onSuccess 将是 undefined

    function (data) {
      targetElement.html(data);
      if (onSuccess) {
        onSuccess(data);
      }
    }
    

    您可能希望查看jQuery.Callbacks 来处理事件回调,尽管您的函数可以使用.load 重写。


    对于来自 Java/C# 重载世界的程序员学习 JavaScript 方式,您可以使用这样的结构(不推荐,这只是一个熟悉的示例) :

    function foo() {
      var fns = {};
      fns[0] = function () {
        //no params
      };
      fns[1] = function () {
        //1 param
      };
      fns[2] = function () {
        //2 params
      };
      fns[arguments.length]();
    }
    

    为每个“重载”提供单独的功能,但是它不是很灵活并且功能计划不佳的症状


    通常不是使用大量参数,而是使用单个options 参数来包含可用参数:

    function foo(options) {
      var settings = $.extend({}, foo.defaultSettings, options);
      //do stuff with settings
    }
    foo.defaultSettings = {
      bar: 'baz',
      fizz: 'buzz'
    }
    

    【讨论】:

    • 也许最好将一个参数作为对象传递,包含不同数量的参数...
    • 推荐的结构简直是愚蠢的。告诉他们停止做错事并学习javascript
    • @Raynos,我从不推荐这种结构。我试图说明这一点。因此这是“计划不周的功能的症状”,这很荒谬。我想我不够清楚,所以我会编辑它。
    【解决方案2】:

    没有。
    Javascript 不支持方法重载。

    相反,您可以创建一个接受所有三个参数的方法,然后检查方法内部是否实际传递了第三个参数。 (所有Javascript函数参数都是可选的)

    【讨论】:

    • @Johan:是的;将参数视为可选参数。
    【解决方案3】:

    还有一条路要走。不要在函数定义中提供任何参数,然后检查arguments array()。您甚至可以检查给定参数的类型,以在您的函数内部进行分支。下面的例子会提醒# 1 #Num(2)

    /** 
     * Usage
     * example(number param1) 
     * example(string, number)
     */
    function example() { // no parameters
        if (arguments.length == 1 && typeof arguments[0] == 'number') {
            alert(' # ' + arguments[0] + ' # ')
        }
        if (arguments.length == 2 && typeof arguments[0] == 'string' && typeof arguments[1] == 'number') {
            alert(arguments[0] + '(' + arguments[1] + ')')
        }
    
    }
    example(1);
    example('Num', 2)
    

    【讨论】:

      猜你喜欢
      • 2010-09-30
      • 1970-01-01
      • 2017-01-25
      • 2016-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多