Subversion-Projekte lars-tiefland.prado

Revision

Details | Letzte Änderung | Log anzeigen | RSS feed

Revision Autor Zeilennr. Zeile
1 lars 1
<com:TContent ID="body" >
2
<h1 id="6501">Pengenalan Javascript</h1>
3
Bimbingan ini berdasarkan pada <a href="http://www.sergiopereira.com/articles/advjs.html">
4
Bimbingan cepat bagi tur JavaScript tingkat lanjut dengan beberapa fitur OO</a> oleh Sergio Pereira.
5
 
6
<h2 id="6502">Hey, Saya tidak tahu Anda bisa melakukannya</h2>
7
<p id="820693" class="block-content">
8
    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.
9
</p>
10
<p id="820694" class="block-content">
11
 
12
    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.
13
</p>
14
<p id="820695" class="block-content">
15
    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.
16
    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.
17
</p>
18
<p id="820696" class="block-content">
19
    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.
20
    Jika Anda mencoba untuk menggunakan banyak librari javascript yang ada di luar sana, seperti
21
    <a href="http://prototype.conio.net/">Prototipe.js</a>,
22
    <a href="http://script.aculo.us/">Scriptaculous</a>,
23
    <a href="http://moofx.mad4milk.net/">moo.fx</a>,
24
    <a href="http://bennolan.com/behaviour/">Perilaku</a>,
25
    <a href="http://developer.yahoo.net/yui/">YUI</a>,
26
    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.
27
</p>
28
 
29
<p id="820697" class="block-content">
30
    Kegunaan dari artikel ini tepatnya menjelaskan tipe konstruksi yang banyak dari kita belum terbiasa dengannya.
31
</p>
32
 
33
 
34
<h2 id="6503">JSON (JavaScript Object Notation)</h2>
35
<p id="820698" class="block-content">
36
    JavaScript Object Notation (<a href="http://www.json.org/">JSON</a>,) 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.
37
</p>
38
<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_820233">
39
var myPet = { color: 'black', leg_count: 4, communicate: function(repeatCount){
40
for(i=0;i&lt;repeatCount;i++) alert('Woof!');} };
41
</com:TTextHighlighter>
42
 
43
<p id="820699" class="block-content">
44
    Mari kita tambahkan sedikit pembentukan agar terlihat lebih mirip bagaimana kita biasa menemukannya di sana:
45
</p>
46
<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_820234">
47
var myPet =
48
{
49
    color: 'black',
50
    legCount: 4,
51
    communicate: function(repeatCount)
52
    {
53
        for(i=0;i&lt;repeatCount;i++)
54
            alert('Woof!');
55
    }
56
};
57
</com:TTextHighlighter>
58
<p id="820700" class="block-content">
59
    Di sini kita membuat referensi ke obyek dengan dua properti (<tt>color</tt>
60
    dan <tt>legCount</tt>) serta metode (<tt>communicate</tt>.)
61
    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.
62
    Setelah obyek dibuat dan ditempatkan ke variabel <tt>myPet</tt>, kita dapat menggunakanya seperti ini:
63
</p>
64
 
65
<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_820235">
66
alert('my pet is ' + myPet.color);
67
alert('my pet has ' + myPet.legCount + ' legs');
68
//jika Anda anjing, mengonggong tiga kali:
69
myPet.communicate(3);
70
</com:TTextHighlighter>
71
<p id="820701" class="block-content">
72
    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.
73
</p>
74
 
75
<h2 id="6504">Apa yang Anda maksud? Fungsi juga adalah sebuah obyek?</h2>
76
<p id="820702" class="block-content">
77
    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.
78
</p>
79
 
80
<p id="820703" class="block-content">
81
    Lihat pada contoh ini. Kami akan mengirimkan fungsi ke fungsi lain yang akan memakainya.
82
</p>
83
<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_820236">
84
var myDog =
85
{
86
    bark: function()
87
    {
88
        alert('Woof!');
89
    }
90
};
91
 
92
var myCat =
93
{
94
    meow: function()
95
    {
96
        alert('I am a lazy cat. I will not meow for you.');
97
    }
98
};
99
 
100
function annoyThePet(petFunction)
101
{
102
    //let's see what the pet can do
103
    petFunction();
104
}
105
 
106
//ganggu anjing:
107
annoyThePet(myDog.bark);
108
//ganggu kucing:
109
annoyThePet(myCat.meow);
110
</com:TTextHighlighter>
111
<p id="820704" class="block-content">
112
    Catatan bahwa kami mengirimkan myDog.bark dan myCat.meow tanpa menambahkan tanda kurung <tt>"()"</tt> kepadanya. Jika kita melakukan itu kita tidak mengirimkan fungsi, sebaliknya kita akan memanggil metode dan mengirimkan nilai hasilnya, <tt>tidak terdefinisi</tt> dalam kedua kasus di sini.
113
</p>
114
 
115
<p id="820705" class="block-content">
116
    Jika Anda ingin membuat kucing malas mulai mengeong, Anda dapat dengan mudah melakukan ini:
117
</p>
118
<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_820237">
119
myCat.meow = myDog.bark;
120
myCat.meow(); //alerts 'Woof!'
121
</com:TTextHighlighter>
122
 
123
<h2 id="6505">Arrays, items, and object members</h2>
124
<p id="820706" class="block-content">
125
    Dua baris berikut dalam JS melakukan hal yang sama.
126
</p>
127
 
128
<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_820238">
129
var a = new Array();
130
var b = [];
131
</com:TTextHighlighter>
132
<p id="820707" class="block-content">
133
    Karena saya yakin Anda sudah mengetahuinya, anda dapat mengakses item individual dalam sebuah array menggunakan tanda kurung kotak:
134
</p>
135
<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_820239">
136
var a = ['first', 'second', 'third'];
137
var v1 = a[0];
138
var v2 = a[1];
139
var v3 = a[2];
140
</com:TTextHighlighter>
141
<p id="820708" class="block-content">
142
 
143
    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.
144
</p>
145
<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_820240">
146
var obj = {}; //baru, obyek kosong
147
obj['member_1'] = 'this is the member value';
148
obj['flag_2'] = false;
149
obj['some_function'] = function(){ /* lakukan sesuatu */};
150
</com:TTextHighlighter>
151
<p id="820709" class="block-content">
152
    Kode di atas mempunyai pengaruh yang sama seperti berikut:
153
</p>
154
<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_820241">
155
var obj =
156
{
157
    member_1:'this is the member value',
158
    flag_2: false,
159
    some_function: function(){ /* lakukan sesuatu */}
160
};
161
</com:TTextHighlighter>
162
 
163
<p id="820710" class="block-content">
164
    Dalam banyak cara, ide obyek dan array asosiatif (hashes) dalam JS tidak dibedakan. Dua baris berikut melakukan hal yang sama juga.
165
</p>
166
<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_820242">
167
obj.some_function();
168
obj['some_function']();
169
</com:TTextHighlighter>
170
 
171
 
172
<h2 id="6506">Cukup tentang obyek, boleh saya memiliki kelas sekarang?</h2>
173
<p id="820711" class="block-content">
174
 
175
    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.
176
</p>
177
<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_820243">
178
//mendefinisikan kelas baru bernama Pet
179
var Pet = function(petName, age)
180
{
181
    this.name = petName;
182
    this.age = age;
183
};
184
 
185
//mari kita membuat obyek dari kelas Pet
186
var famousDog = new Pet('Santa\'s Little Helper', 15);
187
alert('This pet is called ' + famousDog.name);
188
</com:TTextHighlighter>
189
<p id="820712" class="block-content">
190
    Mari kita lihat bagaimana kita menambahkan metode pada kelas <tt>Pet</tt> kita. Kita akan menggunakan properti <tt>prototype</tt> yang dimiliki oleh semua kelas. Properti <tt>prototype</tt> adalah sebuah obyek yang berisi semua anggota yang merupakan obyek yang akan dimiliki oleh kelas.
191
    Bahkan kelas JS standarnya, seperti <tt>String</tt>, <tt>Number</tt>,
192
    dan <tt>Date</tt> mempunyai obyek <tt>prototype</tt> yang bisa kita tambah metode serta propertinya dan menjadikan setiap obyek dari kelas itu secara otomatis mendapatkan anggota baru ini.
193
</p>
194
 
195
<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_820244">
196
Pet.prototype.communicate = function()
197
{
198
    alert('I do not know what I should say, but my name is ' + this.name);
199
};
200
</com:TTextHighlighter>
201
<p id="820713" class="block-content">
202
    Itulah saatnya librari seperti <a href="http://www.sergiopereira.com/articles/prototype.js.html">prototype.js</a> siap digunakan. Jika kita menggunakan prototype.js, kita dapat membuat kode kita lebih bersih (setidaknya menurut saya.)
203
</p>
204
<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_820245">
205
var Pet = Class.create();
206
Pet.prototype =
207
{
208
    //'constructor' kita
209
    initialize: function(petName, age)
210
    {
211
        this.name = petName;
212
        this.age = age;
213
    },
214
 
215
    communicate: function()
216
    {
217
        alert('I do not know what I should say, but my name is ' + this.name);
218
    }
219
};
220
</com:TTextHighlighter>
221
 
222
<h2 id="6507">Fungsi sebagai argumen, pola yang menarik</h2>
223
<p id="820714" class="block-content">
224
    Jika Anda tidak pernah bekerja dengan bahasa yang mendukung klosur Anda akan mendapatkan idion berikut terlalu busuk.
225
</p>
226
<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_820246">
227
var myArray = ['first', 'second', 'third'];
228
myArray.each( function(item, index)
229
{
230
    alert('The item in the position #' + index + ' is:' + item);
231
});
232
</com:TTextHighlighter>
233
<p id="820715" class="block-content">
234
 
235
    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.
236
</p>
237
<p id="820716" class="block-content">
238
    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.
239
    Kita juga dapat menulis kode seperti ini.
240
</p>
241
<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_820247">
242
function myIterator(item, index)
243
{
244
    alert('The item in the position #' + index + ' is:' + item);
245
}
246
 
247
var myArray = ['first', 'second', 'third'];
248
myArray.each( myIterator );
249
</com:TTextHighlighter>
250
<p id="820717" class="block-content">
251
    Tapi ketika kita tidak ingin melakukan seperti semua anak sekolah, bukan?
252
    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.
253
</p>
254
 
255
<h2 id="6508"><tt>this</tt> ini tapi kadang-kadang juga <tt>this</tt> itu</h2>
256
<p id="820718" class="block-content">
257
 
258
    Salah satu masalah yang paling umum yang kita miliki dengan JS adalah saat kita mulai menulis kode kita, itulah kegunaan dari kata kunci <tt>this</tt>. Ini benar-benar menjadi tripwire.
259
</p>
260
<p id="820719" class="block-content">
261
    Seperti disebutkan sebelumnya, sebuah fungsi juga adalah sebuah obyek dalam JS, dan adakalanya kita tidak memperhatikan bahwa kita mengirimkan sebuah fungsi.
262
</p>
263
<p id="820720" class="block-content">
264
    Ambil potongan kode ini sebagai contoh.
265
</p>
266
<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_820248">
267
function buttonClicked()
268
{
269
    alert('button ' + this.id + ' was clicked');
270
}
271
 
272
var myButton = document.getElementById('someButtonID');
273
var myButton2 = document.getElementById('someOtherButtonID');
274
myButton.onclick = buttonClicked;
275
myButton2.onclick = buttonClicked;
276
</com:TTextHighlighter>
277
<p id="820721" class="block-content">
278
    Karena fungsi buttonClicked didefinisikan di luar obyek manapun kita cenderung berpikir kata kunci <tt>this</tt> akan berisi referensi ke
279
    obyek <tt>window</tt> atau <tt>document</tt> (menganggap kode ini ada di tengah halaman HTML yang dilihat dalam browser.)
280
</p>
281
 
282
<p id="820722" class="block-content">
283
    Tapi saat kita menjalankan kode ini kita melihat ia bekerja seperti yang dimaksudkan dan menampilkan <tt>id</tt> dari tombol yang diklik. Apa yang terjadi di sini adalah bahwa kita membuat metode onclick dari setiap tombol yang berisi referensi obyek <tt>buttonClicked</tt>, mengganti apapun yang ada di sana sebelumnya. Sekarang kapan saja tombol diklik, browser akan menjalankan sesuatu mirip dengan baris berikut.
284
</p>
285
<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_820249">
286
myButton.onclick();
287
</com:TTextHighlighter>
288
<p id="820723" class="block-content">
289
 
290
    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.
291
</p>
292
<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_820250">
293
var myHelper =
294
{
295
    formFields: [ ],
296
    emptyAllFields: function()
297
    {
298
        for(i=0; i < this.formFields.length; i++)
299
        {
300
            var elementID = this.formFields[i];
301
            var field = document.getElementById(elementID);
302
            field.value = '';
303
        }
304
    }
305
};
306
 
307
//beritahu kita ingin bekerja dengan field formulir yang mana
308
myHelper.formFields.push('txtName');
309
myHelper.formFields.push('txtEmail');
310
myHelper.formFields.push('txtAddress');
311
 
312
//membersihkan kotak teks:
313
myHelper.emptyAllFields();
314
 
315
var clearButton = document.getElementById('btnClear');
316
clearButton.onclick = myHelper.emptyAllFields;
317
</com:TTextHighlighter>
318
<p id="820724" class="block-content">
319
    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
320
    (tebak apa?) kata kunci <tt>this</tt>.
321
    Masalahnya adalah bahwa <tt>this.formFields</tt> tidak didefinisikan jika
322
    <tt>this</tt> berisi sebuah referensi ke tombol, tepatnya itulah apa yang terjadi. Satu solusi cepat adalah menulis ulang baris kode terakhir.
323
</p>
324
 
325
<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_820251">
326
clearButton.onclick = function()
327
{
328
    myHelper.emptyAllFields();
329
};
330
</com:TTextHighlighter>
331
<p id="820725" class="block-content">
332
    Cara itu kita membuat fungsi baru yang memanggil metode penolong di dalam konteks obyek penolong.
333
</p>
334
<div class="last-modified">$Id: Scripts.page 1650 2007-01-24 06:55:32Z wei $</div></com:TContent>