ここで注意すべき重要なことは、それはJavascriptがあることから、ある動的な言語、すべてのオブジェクトは、基本的に、単なる見せかけであるハッシュマップ(少数の例外を除いて)。また、JavaScriptオブジェクトのすべてにアクセスするには、ブラケット表記とドット表記の2つの方法があります。
質問の最初の部分に答える2つの表記について簡単に説明し、次に2番目の部分に進みます。
ブラケット表記
このモードは、他のプログラミング言語でのハッシュマップと配列へのアクセスに似ています。この構文を使用して、任意のコンポーネント(データ(他のオブジェクトを含む)または関数)にアクセスできます。
これはまさにあなたがあなたの例でやっていることです。あなたは持っている'a'
(と文字列である、ではない、それは、そのようなC ++などの言語になりますように、文字リテラル)。
ブラケット表記を使用して、そのtoUpperCase
メソッドにアクセスします。しかし、それにアクセスするだけではまだ十分ではありません。alert
たとえば、JavaScriptで単にと入力しても、メソッドは呼び出されません。これは単純なステートメントです。関数を呼び出すには、括弧を追加する必要があります。パラメーターを受け取っていないため、をalert()
含む単純なダイアログボックスが表示さundefined
れます。これで、この知識を使用してコードを解読できます。コードは次のようになります。
alert('a'.toUpperCase());
はるかに読みやすいです。
実際、これを少しよく理解するには、次のJavascriptを実行するのがよいでしょう。
alert(alert)
これは、2番目のアラートも実行せずalert
に、関数オブジェクトを渡すことで呼び出しますalert
。表示されるのは(少なくともChrome 26では)次のとおりです。
function alert() { [native code] }
呼び出し:
alert(alert())
は、を含む2つの連続したメッセージボックスを示していますundefined
。これは簡単に説明できます。内部alert()
が最初に実行され、表示されundefined
(パラメータがないため)、何も返されません。外側のアラートは、内側のアラートの戻り値を受け取りundefined
ます。これは何も起こらず、メッセージボックスにも表示されます。
jsFiddleですべてのケースを試してください!
ドット表記
これはより標準的な方法であり、ドット(.
)演算子を使用してオブジェクトのメンバーにアクセスできます。これはあなたのコードがドット表記でどのように見えるかです:
alert('a'.toUpperCase())
はるかに読みやすいです。では、ドット表記を使用する必要がある場合と、ブラケット表記を使用する必要がある場合はどうでしょうか。
比較
2つの方法の主な違いはセマンティックです。他にもいくつかの詳細がありますが、それらについてはすぐに説明します。最も重要なことは、実際に何をしたいかです-経験則として、オブジェクトが持つ確立されたフィールドとメソッドにはドット表記を使用し、実際にオブジェクトをハッシュマップとして使用している場合にはブラケット表記を使用します。
このルールが非常に重要である理由の優れた例は、例に示すことができます。コードでは、ドット表記がより適切である場所でブラケット表記を使用しているため、コードが読みにくくなっています。そして、それは悪いことです。なぜなら、コードは書かれたよりも何度も読み込まれるからです。
場合によっては、ドット表記を使用する方が賢明であっても、ブラケット表記を使用する必要があります。
例:
for(var i = 0; i < 10; ++i) {
foo["method" + i]();
}
つまり、オブジェクトをハッシュマップとして使用する場合はブラケット構文(foods["burger"].eat()
)を使用し、「実際の」フィールドとメソッドを使用する場合はドット構文()を使用する必要がありますenemy.kill()
。JavaScriptが動的言語であるため、オブジェクトの「実際の」フィールドとメソッドと、そこに格納されている「その他の」データとの間の境界線は、かなりぼやける可能性があります。しかし、混乱を招くような方法でそれらを混ぜない限り、問題はありません。
さて、あなたの質問の残りの部分に(ついに!:P)。
メソッドが常にobjのメンバーであることをどのように確認できますか
できません。それを試してみてください。derp
文字列を呼び出してみてください。次の行でエラーが発生します。
Uncaught TypeError: Object a has no method 'derp'
これは、ANYオブジェクトに対してANYメソッドを呼び出す、ちょっとした汎用的な関数です。しかし、それは、指定されたメソッドが既に指定されたオブジェクトの暗黙のメンバーであることを意味しますか?
はい、あなたの場合はそうでなければなりません。そうしないと、上記のエラーが発生します。しかし、あなたはしていない持って使用することreturn obj[method]();
でcallMethod()
機能。map関数で使用される独自の機能を追加できます。すべての文字を大文字に変換するハードコードされたメソッドは次のとおりです。
function makeCap()
{
return function(obj) {
return obj.toUpperCase();
}
}
var caps2 = map(['a', 'b', 'c'], makeCap()); // ['A','B','C']
console.log(caps2)
リンクしたチュートリアルのコードでは、部分関数を使用しています。それら自体はトリッキーなコンセプトです。その主題についてさらに読むことは、私がそれらを理解することができるよりも物事をより明確にするのに役立つでしょう。
注:これは、質問のコードで使用されているマップ関数のコードです。
function map(arr, iterator) {
var narr = [];
for (var i = 0; i < arr.length; i++) narr.push(iterator(arr[i], i));
return narr;
}
arr[5]
。有効な識別子の名前の番号の場合、ドット表記を使用できますarr.5
。