Pengenalan Javascript

Bimbingan ini berdasarkan pada Bimbingan cepat bagi tur JavaScript tingkat lanjut dengan beberapa fitur OO oleh Sergio Pereira.

Hey, Saya tidak tahu Anda bisa melakukannya

Jika Anda adalah seorang pengembang web developer dan datang dari tempat yang sama seperti saya, Anda mungkin telah mengenal sedikit Javascript dalam halaman web Anda, terutama sebagai perekat UI.

Sampai saat ini, saya tahu bahwa Javascript mempunyai kemampuan OO daripada ketika saya dipekerjakan, tetapi saya tidak merasa perlu menggunakannya. Karena browser mulai mendukung set fitur Javascript dan DOM lebih distandarisasikan, itu menjadi semangat untuk menulis kode yang lebih fungsional dan kompleks untuk dijalankan pada klien. Itu membantu kelahiran fenomena AJAX.

Saat kita mulai mempelajari apa yang diperlukan untuk menulis aplikasi AJAX yang baik, kita mulai memperhatikan bahwa Javascript yang kita pakai benar-benar berada di puncak gunung es. Sekarang kita melihat Javascript dipakai melampaui pekerjaan UI sehari-hari yang sederhana seperti validasi input dan tugas-tugas kecil. Kode klien sekarang jauh lebih maju dan berlapis, lebih mirip aplikasi desktop sebenarnya atau klien tebal dari klien-server. Kita melihat librari kelas, model obyek, hirarki, pola, dan banyak hal lain yang dapat kita pakai hanya dalam kode di dalam server.

Dalam banyak cata kita dapat mengatakan bahwa dengan tiba-tiba palang ditaruh lebih tinggi dari sebelumnya. Ia mengambil palang pintu lebih ahli menulis aplikasi untuk Web baru dan kita perlu mengingkatkan keahlian Javascript kita agar bisa sampai ke sana. Jika Anda mencoba untuk menggunakan banyak librari javascript yang ada di luar sana, seperti Prototipe.js, Scriptaculous, moo.fx, Perilaku, YUI, dan lain-lain, Anda secara kebetulan akan menemukan diri Anda sendiri sedang membaca kode JS. Mungkin dikarenakan Anda ingin mempelajari bagaimana mereka melakukannya, atau karena Anda penasaran, atau lebih sering karena itulah satu-satunya cara untuk memahami bagaimana untuk memakainya, karena dokumentasi nampaknya tidak banyak ditujukan terutama terhadap librari ini. Apapun kasusnya, Anda akan menghadapi teknik kung-fu yang akan menjadi asing dan menakutkan jika Anda belum melihat itu sebelumnya.

Kegunaan dari artikel ini tepatnya menjelaskan tipe konstruksi yang banyak dari kita belum terbiasa dengannya.

JSON (JavaScript Object Notation)

JavaScript Object Notation (JSON,) adalah salah satu dari isu baru yang muncul sekitar tema AJAX. JSON, cukup dikatakan suatu cara mendeklarasikan obyek dalam Javascript. Mari kita lihat contoh segera dan perhatikan bagaimana kemudahannya.

var myPet = { color: 'black', leg_count: 4, communicate: function(repeatCount){ for(i=0;i<repeatCount;i++) alert('Woof!');} };

Mari kita tambahkan sedikit pembentukan agar terlihat lebih mirip bagaimana kita biasa menemukannya di sana:

var myPet = { color: 'black', legCount: 4, communicate: function(repeatCount) { for(i=0;i<repeatCount;i++) alert('Woof!'); } };

Di sini kita membuat referensi ke obyek dengan dua properti (color dan legCount) serta metode (communicate.) Tidak sulit untuk memahami bahwa properti obyek dan metode didefinisikan sebagai daftar dipisahkan koma. Masing-masing anggota diperkenalkan dengan nama, diikuti oleh titik dua dan kemudian definisi. Dalam hal properti, ini cukup mudah, hanya nilai properti. Metode yang dibuat dengan penempatan fungsi anonim, yang akan kami jelaskan lebih baik di bawah baris. Setelah obyek dibuat dan ditempatkan ke variabel myPet, kita dapat menggunakanya seperti ini:

alert('my pet is ' + myPet.color); alert('my pet has ' + myPet.legCount + ' legs'); //jika Anda anjing, mengonggong tiga kali: myPet.communicate(3);

Anda akan melihat JSON banyak dipakai di mana saja dalam JS baru-baru ini, sebagai argumen bagi fungsi, sebagai nilai hasil, sebagai respon server (dalam string,) dll.

Apa yang Anda maksud? Fungsi juga adalah sebuah obyek?

Ini mungkin tidak biasa bagi para pengembang yang tidak pernah memikirkan tentang itu, tapi dalam fungsi JS adalah sebuah obyek. Anda bisa mengirimkan sebuah fungsi sebagai argumen terhadap fungsi lain sama seperti Anda mengirimkan sebuah string, misalnya. Ini sering dipakai dan siap digunakan.

Lihat pada contoh ini. Kami akan mengirimkan fungsi ke fungsi lain yang akan memakainya.

var myDog = { bark: function() { alert('Woof!'); } }; var myCat = { meow: function() { alert('I am a lazy cat. I will not meow for you.'); } }; function annoyThePet(petFunction) { //let's see what the pet can do petFunction(); } //ganggu anjing: annoyThePet(myDog.bark); //ganggu kucing: annoyThePet(myCat.meow);

Catatan bahwa kami mengirimkan myDog.bark dan myCat.meow tanpa menambahkan tanda kurung "()" kepadanya. Jika kita melakukan itu kita tidak mengirimkan fungsi, sebaliknya kita akan memanggil metode dan mengirimkan nilai hasilnya, tidak terdefinisi dalam kedua kasus di sini.

Jika Anda ingin membuat kucing malas mulai mengeong, Anda dapat dengan mudah melakukan ini:

myCat.meow = myDog.bark; myCat.meow(); //alerts 'Woof!'

Arrays, items, and object members

Dua baris berikut dalam JS melakukan hal yang sama.

var a = new Array(); var b = [];

Karena saya yakin Anda sudah mengetahuinya, anda dapat mengakses item individual dalam sebuah array menggunakan tanda kurung kotak:

var a = ['first', 'second', 'third']; var v1 = a[0]; var v2 = a[1]; var v3 = a[2];

Tetapi Anda tidak dibatasi pada indeks numerik. Anda bisa mengakses banyak obyek JS dengan menggunakan namanya, dalam sebuah string. Contoh berikut membuat obyek kosong, dan menambah beberapa anggotanya dengan nama.

var obj = {}; //baru, obyek kosong obj['member_1'] = 'this is the member value'; obj['flag_2'] = false; obj['some_function'] = function(){ /* lakukan sesuatu */};

Kode di atas mempunyai pengaruh yang sama seperti berikut:

var obj = { member_1:'this is the member value', flag_2: false, some_function: function(){ /* lakukan sesuatu */} };

Dalam banyak cara, ide obyek dan array asosiatif (hashes) dalam JS tidak dibedakan. Dua baris berikut melakukan hal yang sama juga.

obj.some_function(); obj['some_function']();

Cukup tentang obyek, boleh saya memiliki kelas sekarang?

Kekuatan besar dari bahasa pemrograman obyek berasal dari pemakaian kelas. Saya tidak berpikir telah menebak bagaimana kelas didefinisikan dalam JS hanya menggunakan pengalaman saya sebelumnya dengan bahasa lainnya. Nilailah bagi diri Anda sendiri.

//mendefinisikan kelas baru bernama Pet var Pet = function(petName, age) { this.name = petName; this.age = age; }; //mari kita membuat obyek dari kelas Pet var famousDog = new Pet('Santa\'s Little Helper', 15); alert('This pet is called ' + famousDog.name);

Mari kita lihat bagaimana kita menambahkan metode pada kelas Pet kita. Kita akan menggunakan properti prototype yang dimiliki oleh semua kelas. Properti prototype adalah sebuah obyek yang berisi semua anggota yang merupakan obyek yang akan dimiliki oleh kelas. Bahkan kelas JS standarnya, seperti String, Number, dan Date mempunyai obyek prototype yang bisa kita tambah metode serta propertinya dan menjadikan setiap obyek dari kelas itu secara otomatis mendapatkan anggota baru ini.

Pet.prototype.communicate = function() { alert('I do not know what I should say, but my name is ' + this.name); };

Itulah saatnya librari seperti prototype.js siap digunakan. Jika kita menggunakan prototype.js, kita dapat membuat kode kita lebih bersih (setidaknya menurut saya.)

var Pet = Class.create(); Pet.prototype = { //'constructor' kita initialize: function(petName, age) { this.name = petName; this.age = age; }, communicate: function() { alert('I do not know what I should say, but my name is ' + this.name); } };

Fungsi sebagai argumen, pola yang menarik

Jika Anda tidak pernah bekerja dengan bahasa yang mendukung klosur Anda akan mendapatkan idion berikut terlalu busuk.

var myArray = ['first', 'second', 'third']; myArray.each( function(item, index) { alert('The item in the position #' + index + ' is:' + item); });

Wah! Mari kita jelaskan apa yang terjadi di sini sebelum Anda memutuskan saya telah pergi terlalu jauh dan beralih ke artikel yang lebih baik dari yang ini.

Pertama, dalam contoh di atas kita menggunakan librari prototype.js, yang menambahkan setiap fungsi ke kelas array. Setiap fungsi menerima satu argumen yang adalah obyek fungsi. Fungsi ini, silah berganti akan dipanggil sekali untuk setiap item dalam array, mengirimkan dua argumen saat dipanggil, item dan indeks untuk item saat ini. Mari kita panggil fungsi ini sebagai fungsi pengulang kita. Kita juga dapat menulis kode seperti ini.

function myIterator(item, index) { alert('The item in the position #' + index + ' is:' + item); } var myArray = ['first', 'second', 'third']; myArray.each( myIterator );

Tapi ketika kita tidak ingin melakukan seperti semua anak sekolah, bukan? Lebih serius, bagaimanapun juga, format terakhir ini lebih sederhana untuk dimengerti karena kita memasuki kode mencari fungsi myIterator. Adalah baik untuk memiliki logaika fungsi iterator di sana dalam tempat yang sama ia dipanggil. Juga, dalam hal ini, kitak tidak memerlukan fungsi iterator di manapun juga dalam kode kita, maka kita dapat mengubahnya ke dalam fungsi anonim tanpa hukuman.

this ini tapi kadang-kadang juga this itu

Salah satu masalah yang paling umum yang kita miliki dengan JS adalah saat kita mulai menulis kode kita, itulah kegunaan dari kata kunci this. Ini benar-benar menjadi tripwire.

Seperti disebutkan sebelumnya, sebuah fungsi juga adalah sebuah obyek dalam JS, dan adakalanya kita tidak memperhatikan bahwa kita mengirimkan sebuah fungsi.

Ambil potongan kode ini sebagai contoh.

function buttonClicked() { alert('button ' + this.id + ' was clicked'); } var myButton = document.getElementById('someButtonID'); var myButton2 = document.getElementById('someOtherButtonID'); myButton.onclick = buttonClicked; myButton2.onclick = buttonClicked;

Karena fungsi buttonClicked didefinisikan di luar obyek manapun kita cenderung berpikir kata kunci this akan berisi referensi ke obyek window atau document (menganggap kode ini ada di tengah halaman HTML yang dilihat dalam browser.)

Tapi saat kita menjalankan kode ini kita melihat ia bekerja seperti yang dimaksudkan dan menampilkan id dari tombol yang diklik. Apa yang terjadi di sini adalah bahwa kita membuat metode onclick dari setiap tombol yang berisi referensi obyek buttonClicked, mengganti apapun yang ada di sana sebelumnya. Sekarang kapan saja tombol diklik, browser akan menjalankan sesuatu mirip dengan baris berikut.

myButton.onclick();

Itu tidak membingungkan sama sekali bukan? Tapi lihat apa yang terjadi, Anda mulai memiliki obyek lain yang berhadapan dengannya dan Anda ingin betindak pada obyek ini terhadap event seperti klik tombol.

var myHelper = { formFields: [ ], emptyAllFields: function() { for(i=0; i < this.formFields.length; i++) { var elementID = this.formFields[i]; var field = document.getElementById(elementID); field.value = ''; } } }; //beritahu kita ingin bekerja dengan field formulir yang mana myHelper.formFields.push('txtName'); myHelper.formFields.push('txtEmail'); myHelper.formFields.push('txtAddress'); //membersihkan kotak teks: myHelper.emptyAllFields(); var clearButton = document.getElementById('btnClear'); clearButton.onclick = myHelper.emptyAllFields;

Anda pikir bagus, sekarang saya dapat mengklik tombol Clear pada halaman saya dan tiga kotak teks itu akan dikosongkan. Kemudian Anda mencoba mengklik tombol hanya untuk mendapatkan kesalahan runtime. Kesalahan akan terkait dengan (tebak apa?) kata kunci this. Masalahnya adalah bahwa this.formFields tidak didefinisikan jika this berisi sebuah referensi ke tombol, tepatnya itulah apa yang terjadi. Satu solusi cepat adalah menulis ulang baris kode terakhir.

clearButton.onclick = function() { myHelper.emptyAllFields(); };

Cara itu kita membuat fungsi baru yang memanggil metode penolong di dalam konteks obyek penolong.