Hal penting yang perlu diperhatikan di sini adalah, karena Javascript adalah bahasa yang dinamis , setiap objek pada dasarnya hanyalah peta hash yang dimuliakan ( dengan beberapa pengecualian ). Dan segala sesuatu dalam objek Javascript dapat diakses dengan dua cara - notasi braket dan notasi titik.
Saya akan segera membahas dua notasi yang menjawab bagian pertama dari pertanyaan Anda, dan kemudian saya akan sampai ke bagian kedua.
Notasi braket
Mode ini lebih mirip dengan mengakses hashmaps dan array dalam bahasa pemrograman lain. Anda dapat mengakses komponen apa pun (data (termasuk objek lain) atau fungsi) menggunakan sintaks ini.
Inilah yang Anda lakukan dalam contoh Anda. Anda miliki 'a', yang merupakan string (dan bukan karakter literal, seperti itu akan dalam bahasa seperti C ++).
Menggunakan notasi braket, Anda mengakses toUpperCasemetodenya. Tetapi mengaksesnya masih belum cukup; cukup mengetik alert, misalnya, dalam Javascript, tidak memanggil metode. Itu hanya pernyataan sederhana. Untuk memanggil fungsi, Anda perlu menambahkan tanda kurung: alert()menunjukkan kotak dialog sederhana yang berisi undefined, karena tidak menerima parameter. Kami sekarang dapat menggunakan pengetahuan ini untuk menguraikan kode Anda, yang menjadi:
alert('a'.toUpperCase());
Yang jauh lebih mudah dibaca.
Sebenarnya, cara yang baik untuk memahami ini sedikit lebih baik adalah dengan mengeksekusi Javascript berikut:
alert(alert)
Ini panggilan alertdengan melewatkannya objek fungsi, juga alert, tanpa juga menjalankan peringatan kedua. Apa yang ditampilkan (setidaknya di Chrome 26) adalah sebagai berikut:
function alert() { [native code] }
Panggilan:
alert(alert())
menampilkan dua kotak pesan berurutan yang berisi undefined. Ini mudah dijelaskan: bagian dalam alert()dieksekusi pertama kali, menunjukkan undefined(karena tidak memiliki parameter apa pun) dan tidak mengembalikan apa pun. Lansiran luar menerima nilai balik lansiran batin - yang bukan apa-apa, dan juga ditampilkan undefineddi kotak pesan.
Cobalah semua kasing di jsFiddle!
Notasi dot
Ini adalah pendekatan yang lebih standar, yang memungkinkan anggota objek diakses menggunakan .operator dot ( ). Ini akan menjadi seperti apa kode Anda dalam notasi titik:
alert('a'.toUpperCase())
Jauh lebih mudah dibaca. Jadi kapan kita harus menggunakan notasi titik, dan kapan kita harus menggunakan notasi braket?
Perbandingan
Perbedaan utama antara kedua metode ini adalah semantik. Ada juga beberapa detail lain, tetapi saya akan sampai di sana sebentar lagi. Yang paling penting adalah apa yang sebenarnya ingin Anda lakukan - aturan praktisnya adalah Anda menggunakan notasi titik untuk bidang yang sudah mapan dan metode yang dimiliki objek, dan notasi braket ketika Anda benar-benar menggunakan objek Anda sebagai peta hash .
Contoh yang bagus tentang mengapa aturan ini sangat penting dapat ditunjukkan dalam contoh Anda - karena kode menggunakan notasi braket di tempat di mana notasi titik jauh lebih masuk akal, itu membuat kode lebih sulit dibaca. Dan itu hal yang buruk, karena kode dibaca lebih banyak daripada yang tertulis .
Dalam beberapa kasus, Anda harus menggunakan notasi braket walaupun menggunakan notasi titik lebih masuk akal:
Jika anggota objek memiliki nama yang mengandung satu atau lebih spasi atau karakter khusus lainnya, Anda tidak dapat menggunakan notasi titik: foo.some method()tidak berfungsi, tetapi foo["some method"]()tidak;
jika Anda perlu mengakses anggota objek secara dinamis, Anda juga terjebak menggunakan notasi braket;
Contoh:
for(var i = 0; i < 10; ++i) {
foo["method" + i]();
}
Intinya adalah bahwa Anda harus menggunakan sintaks braket saat menggunakan objek sebagai peta hash ( foods["burger"].eat()) dan sintaksis titik ketika bekerja dengan bidang dan metode "aktual" ( enemy.kill()). Dengan Javascript menjadi bahasa yang dinamis, garis antara bidang "aktual" dan metode suatu objek dan data "lainnya" yang disimpan di dalamnya bisa menjadi cukup buram. Tetapi selama Anda tidak mencampurnya dengan cara yang membingungkan, Anda harus baik-baik saja.
Sekarang, ke sisa pertanyaan Anda (akhirnya!: P).
bagaimana saya bisa yakin metode akan selalu menjadi anggota obj
Kamu tidak bisa Cobalah. Cobalah untuk memanggil derpsebuah string. Anda akan mendapatkan kesalahan di baris:
Uncaught TypeError: Object a has no method 'derp'
Ini adalah fungsi yang agak umum untuk memanggil metode APA SAJA pada objek APAPUN. Tetapi apakah itu berarti metode yang ditentukan sudah akan menjadi anggota implisit dari objek yang ditentukan?
Ya, dalam kasus Anda itu harus. Kalau tidak, Anda berakhir dengan kesalahan yang saya sebutkan di atas. Namun, Anda tidak harus menggunakan return obj[method]();dalam callMethod()fungsi. Anda dapat menambahkan fungsionalitas Anda sendiri yang kemudian digunakan oleh fungsi peta. Inilah metode hard-coded yang mengubah semua huruf menjadi huruf besar:
function makeCap()
{
return function(obj) {
return obj.toUpperCase();
}
}
var caps2 = map(['a', 'b', 'c'], makeCap()); // ['A','B','C']
console.log(caps2)
Kode dalam tutorial yang Anda tautkan menggunakan fungsi parsial . Mereka konsep yang rumit sendiri. Membaca lebih banyak tentang subjek itu akan membantu memperjelas hal-hal yang saya tidak bisa membuatnya.
Catatan: ini adalah kode fungsi peta yang digunakan oleh kode dalam pertanyaan, sumber di sini .
function map(arr, iterator) {
var narr = [];
for (var i = 0; i < arr.length; i++) narr.push(iterator(arr[i], i));
return narr;
}
arr[5]. Jika nomor di mana nama-nama identifier yang valid Anda bisa menggunakan notasi titik:arr.5.