4

C# では、次のようにオーバーロードされた関数がある場合があります。

public string OverLoad(string str1)                  {return str1;}
public string OverLoad(string str1, string str2)     {return str1+str2;}

JavaScript にはオーバーロードされた関数のサポートが組み込まれていないことは知っていますが、オーバーロードされた関数の機能を実現するためにこれを回避する人はいますか?

私は興味があります:

1.) 速度への影響

2.) 異なる関数名とオーバーロードを使用する理由

パラメータが定義されていないかどうかを確認し、JavaScript の機能を「偽造」できるようです。パラメータの数を変更するだけで関数を簡単に変更できることは、私にとって非常に有利です。

4

3 に答える 3

4

JavaScript では、オブジェクトの属性であるパラメーターを渡す傾向があります。つまり、オブジェクトであるパラメーターが 1 つあるため、任意の順序で何でも指定できます。このアプローチを使用すると、「未定義」をチェックでき、関数はそれに応じて動作できます。

さまざまなケースでかなり大きな動作がある場合は、各ケースを個別の関数に分割することでこのアイデアを拡張できます。これは、メインの「オーバーロードされた」関数によって呼び出されます。

例えば:

function a (params) {
    // do for a
}
function b () {
    // do for b
}
function main (obj) {
    if (typeof obj.someparam != 'undefined') {
        a(whatever-params);
    } else if (typeof obj.someotherparam != 'undefined') {
        b(whatever-params);
    }
}

数値パラメーターまたは引数の数に基づいて、これと同じアプローチを使用することもできます。引数の使用については、こちらを参照してください。

于 2013-03-30T15:23:47.490 に答える
2

JavaScript 関数のオーバーロードはサポートされていません。可変数のパラメーターを渡すことができましたが。

渡された数とそのタイプを内部で確認する必要がありfunctionますarguments

于 2013-03-30T15:23:06.197 に答える
2

これは非常に一般的であるため、注意もされていません。

たとえば、JQuery では、on()メソッドに複数の呼び出しシグネチャがあります。

.on( events [, selector ] [, data ], handler(eventObject) )
.on( events [, selector ] [, data ] )

最初のフォームへの呼び出しは次のようになり$('sel').on('click', function(e){/*handler*/})ます。2 番目のフォームへの呼び出しは次のようになり$('sel').on({click: function(e){/*click handler*/}, mouseover: function(e){/*mouseover handler*/})ます。これは、Java/C# 用語における「ポリモーフィズム」(つまり、異なる型の引数) と「オーバーロード」(つまり、オプションの引数) の両方を示していることに注意してください。

キーワード引数 (単一のオブジェクト引数を使用してシミュレート) も一般的$.ajax({settings})です。

はい、これはいたるところで行われていますが、これを「過負荷」と呼ぶのはカテゴリの混乱です。JS は静的に型付けされているわけでも、その関数に固定数の関数引数があるわけでもありません。呼び出し時には、関数が宣言する内容に関係なく、必要な数の引数を指定できます。関数宣言の引数リストは、固定された関数シグネチャとしてではなく、argumentsマジック変数の配列分解の省略形として表示する必要があります。

速度への影響は非常に小さいため、考慮に入れることさえできません。

いつこれを行うか、いつ別の関数を使用するかについては、それは完全にプログラムの明確さと使いやすさの問題であり、おそらく幅広い意見の対象となります。

于 2013-03-30T15:40:05.343 に答える