2011-11-23 145 views
1
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中使用重載?

回答

2

有沒有直接指定在JS的重載方法是這樣的方式。

許多解決方法。

在你的情況,你可以用3個參數定義函數:

function (path, targetElement, onSuccess) 

,如果函數調用只有2個參數,onSuccessundefined

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' 
} 
+0

也許它更好地傳遞一個參數作爲一個對象,包含不同數量的參數... – Johan

+1

推薦的結構簡直是愚蠢的。告訴他們停止做錯了,學習javascript – Raynos

+0

@Raynos,我從來沒有推薦過這種結構。我正在試圖說明一點。這是荒謬的,因此「功能設計不良的症狀」。我想我還不夠清楚,所以我會編輯它。 – zzzzBov

0


JavaScript不支持方法重載。

相反,你就可以說通吃三個參數一個方法,然後檢查第三個參數是否實際上是通過方法內。 (所有的JavaScript函數參數都是可選)

+0

好了,任何的替代品? – Johan

+0

@Johan:是的;將該參數視爲可選。 – SLaks

0

還有另外的路要走。不要在函數定義中給出任何參數,然後檢查arguments數組()。你甚至可以檢查給定參數的類型,以在你的函數內部進行分支。下面的例子將提醒# 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)