2011-12-29 5 views
0

プラグインの開発のためにjQueryのドキュメントを読んでいましたが、私は頭を抱くことはできません。 jQueryプラグインのアーキテクチャ構文 - この行は何を意味しますか?

$.fn.tooltip = function(method) { 

if (methods[method]) { 
    return methods[method].apply(this, Array.prototype.slice.call(arguments, 1)); 
} else if (typeof method === 'object' || ! method) { 
    return methods.init.apply(this, arguments); 
} else { 
    $.error('Method ' + method + ' does not exist on jQuery.tooltip'); 
}  

問題の行

return methods[method].apply(this, Array.prototype.slice.call(arguments,1)); 

私はすべてのJavaScriptのオブジェクトが呼び出しを()を継承し、適用()と私は、これら2つの関数の差延を理解していることを理解しています。私が理解できないことは、配列のプロトタイプです。 Arrayオブジェクトには既にslice()があります。なぜ、ここにプロトタイプが必要なのですか? call()は 'this'(コンテキスト)と引数のリストである2つの引数を取るので、私は上記の呼び出しがどのように動作するのか理解していません。誰かが私にこの行を理解させるのを助けることができるかargumentsオブジェクトがObject.prototypeから継承

おかげ

+0

'arguments'は配列ではありません(独自の' slice() 'メソッドはありません)。このように呼び出された場合は' slice() 'は配列のようなオブジェクトです。 – kapa

+0

それで、call()に引数の2番目の項目(arguments [1])が渡されていますか? – Nick

+0

'1'は実際には' slice() 'のパラメータです。 – kapa

答えて

1

。配列のように見えるかもしれませんが、そうではありません。

Array.prototype.slice.call(arguments,1) 

前の行コピーarguments「アレイ」、及びその上にslice(1)方法を使用しています。その上にアレイ操作を実行するために、次の行が必要です。最初含まれていない配列を返す.slice(1)方法を使用して、(引数にArray.slice`のthisを設定することにより)真アレイ

    • 変換arguments

      Array.prototype.slice(arguments, 1)は、と等価です素子。

    argumentsオブジェクトがこのプロセス中に変更されていないことに注意してください)

    擬似コード:以下のように

    var arguments = {1: "arg1", 2: "arg2", 3: "arg3", length: 3}; 
    var copy = convert_object_to_array(arguments); //This function does not exists 
    // copy looks like: ["arg1", "arg2", "arg3"] 
    copy.slice(1); //Returns ["arg2", "arg3"] 
    
  • +0

    今は完全に意味があります。ありがとう! – Nick

    1

    は非常に簡単に言えば、関数Array.prototype.sliceは:

    Array.prototype.slice = function(from) { 
        return elements of `this` from index `from`; 
    }; 
    

    そうするときArray.prototype.slice.call(obj, a)では、インデックスaの要素のみを使用してobjを取得します。

    問題は、それが配列でのみ利用可能であることですが、あなたにも、あなたが説明した構文を使用して、それがオブジェクトに取り組んで取得することができます。

    var obj = { length: 3, 0: 'a', 1: 'b', 2: 'c' }; 
    Array.prototype.slice.call(obj, 1); // { length: 2, 0: 'b', 1: 'c' } 
    

    同じ引数のために行く - それは配列ではありませんしたがって、Array.prototype.slice.callで関数にアクセスする必要があります。

    基本的に、配列と引数が異なるのは、配列がArray.prototypeから継承されるということだけです。arr.slice()を直接呼び出すことができます。

    +0

    up-vote ..これは非常に良い答えでした。ありがとう! – Nick

    関連する問題