私は現在、 John Resigの Secrets of the JavaScript Ninja を勉強しており、誰かがその例の 1 つをさらに理解するのを手伝ってくれることを願っています。
オブジェクトでメソッドのオーバーロードを可能にする関数であり、各オーバーロードには独自の定義と動作があります。彼はここでそれについてブログを書きました。
コードは次のようになります。
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);
};
そして、このように使用されます:
addMethod(obj,'funcName',function(){});
addMethod(obj,'funcName',function(a){});
addMethod(obj,'funcName',function(a,b){});
これがどのように機能するかはほとんど理解していると思いますが、上記のブログ投稿よりも詳しい説明を得ることができます)。
ただし、クロージャーの値にアクセスし、クロージャーold
をfn
使用しています。これについてはまだ調査中です。
編集 - 以下に追加jsFiddle
。
それを理解しようとすると、改行fn.apply(this, arguments)
は単純return fn()
に同じ結果と思われるものになる可能性があることに気付きました。このjsFiddleの例を参照してください。
apply
では、必要でないのになぜ構文を使用しているのでしょうか?
適用せずにjsFiddleの例を試してみましたが、常に問題があるようです
また、特に次の場合に、これらの関数を返すときに正確に何が起こっているのか:
return old.apply(this, arguments);
この方法の使用方法だけでなく、なぜそれが機能するのかをしっかりと理解したいので、洞察をいただければ幸いです.
ありがとう