0

関数のオーバーロードに関するJhonresigの投稿を読みました。

http://ejohn.org/blog/javascript-method-overloading/

機能:

function Users(){
  addMethod(this, "find", function(){
    // Find all users...
  });
  addMethod(this, "find", function(name){
    // Find a user by name
  });
  addMethod(this, "find", function(first, last){
    // Find a user by first and last name
  });
}

// addMethod - By John Resig (MIT Licensed)
function addMethod(object, name, fn){
    var old = object[ name ];
    object[ name ] = function(){
        if ( fn.length == arguments.length )
            return fn.apply( this, arguments );
        else if ( typeof old == 'function' )
            return old.apply( this, arguments );
    };
}

私はその概念を理解しています。else if私が理解できないことの1つは、ステートメントが引数を実行するたびにreturn old.apply(this, arguments)、引数の長さが1つ減る理由です。

私はアラートを使用して機能を追跡しましたが、それが私が理解できない主なことです。

任意の支援をいただければ幸いです。

4

1 に答える 1

0

アリティが一致する関数が見つかるoldまで、次々に呼び出される一連の関数が効率的に作成されます。arguments.lengthしたがって、 への最初の呼び出しでは、になりaddMethodます。oldundefined

を 2 回目に呼び出すとaddMethodold最初の呼び出しで割り当てられた関数になります。

これを実行すると:

var users = new Users();
users.find("James");

users識別子のプロパティを探しますfind。1 つが見つかり、その関数のアリティは 2 になります (addMethodコンストラクターでの最後の呼び出しで、2 つの引数を必要とするメソッドが作成されるため)。したがって、それを呼び出す代わりに、 を呼び出しますold。これは、1 つの引数を期待するメソッドのバージョンになります。呼び出しには単一の引数があり、それが一致するため、それが実行されるメソッドです。

これを実行すると:

users.find();

上記で説明したとおりに実行されますが、呼び出し時にoldアリティが一致せず、old再度呼び出します。oldこの状況での の値は、 を最初に呼び出した後の値になりますaddMethod(これは通常、クロージャと呼ばれるもののデモンストレーションですold。親関数が戻った後も、古い関数は引き続き使用できます)。

于 2013-01-29T15:12:21.287 に答える