2011-04-20 9 views
3

私は答えのためにグーグルとstackoverflowの検索、いくつかのトラブルのJavaScriptコードのこの部分が何をしているか持っています:この奇妙なJavaScript配列の構文は何ですか?

array[index](argument); 

obj['e'+type+fn](window.event); 

私これには、引数/パラメータを使用して配列要素のように見えます

しかし、私はこれが何をしているのか分かりません。これは次のものと同等ですか?

array[index]=argument 

これは、配列要素に引数を割り当てていますか?

誰かがこれが何をしているのかの簡単な/一般的な例を提供することができればすばらしいでしょう。 John Resig's addEvent() implementationを解読しようとしています。私は実際にこの実装やそれに関連する例の説明を探しているわけではありませんが、いくつかの想像した製品を使用するMDC has done for callのようなダンサーダウンのような例のようです。

答えて

5

これは単なるオブジェクトのプロパティにアクセスする方法です。あなたがオブジェクト

a = { 
name: 'someName' 
age: 20 
}; 

を持っている場合たとえば、あなたはa['name']上記のように、a.nameを使ったりして名前にアクセスすることができます。

彼が[]表記を使用している理由は、複数の文字列からキーを作成できるからです。

したがって、type=clickfn=fooの場合、彼はobj.eclickfooにアクセスしています。またはobj['eclickfoo']

オブジェクトのこのプロパティは、();を使用してオブジェクトを呼び出すメソッドでなければなりません。

obj.eclickfoo(window.event); 

または同等

obj['eclickfoo'](window.event); 
2

これは、それがやっていることです。

を配列objから、それはインデックス'e'+type+fnと機能を取ります。その後、window.eventをパラメータとして渡して実行します。

()は関数を呼び出し、[]は配列から値を抽出することを覚えておいてください。

+1

「obj.esome_typesome_function(window.event)」のようなものを実行するのと同じですが、あなたが尋ねる表記法では、プロパティ名を動的に構成することができます。 –

+0

@Hans Engel:まったく –

0

obj['e'+type+fn]は、関数型を返します。これは、window.eventをパラメータとして実行されます。

0
obj['e'+type+fn](window.event); 

配列が実際に "OBJ [...]" 表記を使用できますが、そうJavaScriptで任意のオブジェクトは、次のことができますので、もう一度、彼は言っています。この場合、Resigはすべてのオブジェクト、特にDOMオブジェクト用にプロパティを追加しています。

obj['aVar']は、obj.aVarに相当します。前者の利点は、JavaScriptで特別な意味を持つように予約されているキーワードでも機能できることです(例:、obj ['var']オブジェクトに "var"というプロパティを定義した場合)、プロパティ名に動的にアクセスすることができます。 typeは変数なのでobj.typeを実行することができませんでした。これは正確に "type"という名前のプロパティを見つけて、typeという変数に等しい名前のプロパティを見つけられないためです。

オブジェクト(または配列)は関数をデータとして保持できるため、オブジェクトや配列の内部にある関数の呼び出し演算子(括弧にマッチするもの)を使用することもできます。オブジェクトに以前に格納された「メソッド」または関数である)を呼び出し、次にwindow.eventオブジェクトを単一の引数として呼び出す。

ファンクションには、プロトタイプに組み込みのtoStringメソッドがあります(このような場合は、文字列を連結している場所で呼び出されるため、文字列が必要です。あなた自身のtoStringメソッドもあなたの関数にあります。関数もJavaScriptのオブジェクトですから! Resigのコードはこれを利用して新しいプロパティを定義していますが、これは通常は悪い考えですが、他のアプリケーションと衝突する可能性はほとんどありません。

のでdocument.bodyobjtype変数は「FN」を「クリック」とするように設定されている場合function() {alert('boo!');}"に設定されている場合、それは実際に({)(eloadfunction」として警戒をdocument.bodyオブジェクトのプロパティに名前を付けます'ブー!');} "。彼が説明するように、このプロパティを作成して(そしてそれを自分の無名関数の中で呼び出す)、その内部で使用される "this"キーワードの通常の振る舞いで関数を呼び出すことができます。thisは親オブジェクトを参照しますobjであり、グローバルではありません(objがグローバルでない場合、つまりwindowオブジェクト)。