|
| 1 | +AGENDA |
| 2 | +-> Pengenalan Object Oriented Progrmamming |
| 3 | +-> Class |
| 4 | +-> Object |
| 5 | +-> Inheritance |
| 6 | +-> Iterable dan Iterators |
| 7 | +-> Standard JavaScript Classes |
| 8 | +-> Dan lain-lain |
| 9 | + |
| 10 | +JavaScript Object Oriented Progrmamming |
| 11 | + => Sudut pandang bahasa pemrogramman yang berkonsep "Objek" & "Class" |
| 12 | + |
| 13 | +Object |
| 14 | + => Data yang berisi field / properties / attributes dan method / function / behavior |
| 15 | + |
| 16 | +Class |
| 17 | + => Blueprint, prototype / cetakan untuk membuat Object |
| 18 | + => Berisikan deklarasi semua properties dan function yang dimiliki oleh Object |
| 19 | + => Setiap Object selalu dibuat dari Class |
| 20 | + => Dan sebuah Class membuat Object tanpa batas |
| 21 | + |
| 22 | +OOP di JavaScript |
| 23 | + => JavaScript sendiri sebenarnya sejak awal dibuat sebagai bahasa prosedural |
| 24 | + => Implementasi OOP di JavaScript memang tidak sedetail bahasa pemrogramman lain |
| 25 | + yang memang dari awal merupakan bahasa pemrogramman OOP seperti Java atau C++ |
| 26 | + |
| 27 | +Membuat Object |
| 28 | + => Membuat variable dengan tipe data Object |
| 29 | + => Pembuatan Object menggunakan tipe data Object, akan membuat object yang selalu unik |
| 30 | + namun OOP : Biasanya membuat Class sebagai cetakan, |
| 31 | + sehingga bisa membuat object dengan karakteristik yang sama berkali-kali |
| 32 | + tanpa harus mendeklarasikan object berkali-kali |
| 33 | + seperti menggunakan tipe data object |
| 34 | + |
| 35 | +Membuat Constructor function |
| 36 | + => EcmaScript versi 6, pembuatan class biasanya menggunakan function. |
| 37 | + => JavaScript bukanlah bahasa pemrogramman yang fokus ke OOP |
| 38 | + => Untuk membuat class di JavaScript lama, |
| 39 | + kita bisa membuat function |
| 40 | + |
| 41 | +Membuat Object dari Constructor function |
| 42 | + => Menggunakan kata kunci new, lalu diikuti dengan Constructor functionya. |
| 43 | + |
| 44 | +Property di Constructor function |
| 45 | + => Sebenarnya setalah membuat object bisa dengan mudah menambahkan property ke dalam object tersebut |
| 46 | + hanya dengan menggunakan variable nya, |
| 47 | + diikuti tanda titik dan nama property |
| 48 | + => Namun jika seperti itu, alhasil constructor function yang sudah kita buat terlalu berguna |
| 49 | + => Untuk menambahkan property di dalam semua object yang dibuat constructor function, |
| 50 | + kita bisa menggunakan kata kunci 'this' lalu diikuti dengan nama 'property' nya |
| 51 | + |
| 52 | +Method di Constructor Function |
| 53 | + => Sama seperti pada tipe data object biasanya, |
| 54 | + dapat menambahkan method di dalam constructor function |
| 55 | + => Jika kita tambahkan method di constructor function, |
| 56 | + secara otomatis object yang dibuat akan memiliki method tersebut |
| 57 | + |
| 58 | +Parameter di Constructor Function |
| 59 | + => Karena dalam JavaScript, class adalah berbentuk function, |
| 60 | + jadi secara default function tersebut bisa memiliki Parameter |
| 61 | + => Constructor function sama seperti function biasanya, |
| 62 | + bisa memiliki parameter, |
| 63 | + hal ini membuat ketika kita membuat object, |
| 64 | + kita bisa mengirim langsung data lewat parameter |
| 65 | + di constructor function tersebut |
| 66 | + |
| 67 | +Constructor Inheritance |
| 68 | + => Dalam constructor kita biasanya membuat property |
| 69 | + baik itu berisi vaule ataupun function |
| 70 | + => Dapat memanggil constructor lain, |
| 71 | + dengan begitu bisa mewarisi semua property yang dibuat di constructor lain |
| 72 | + => Untuk memanggil constructor lain, |
| 73 | + bisa menggunaan NamaConstructor.call(this, parameter) |
| 74 | + |
| 75 | +Prototype |
| 76 | + => JavaScript sebelumnya dikenal dengan pemrogramman berbasis prototype |
| 77 | + |
| 78 | +Prototype Inheritance |
| 79 | + => Saat membuat object dari constructor function, |
| 80 | + object tersebut disebut instance (object), |
| 81 | + semua property (value dan method) akan berada di dalam instance object nya |
| 82 | + => Setiap membuat sebuah constructor function, |
| 83 | + maka secara otomatis akan dibuatkan prototype nya, |
| 84 | + seperti membuat constructor Person, |
| 85 | + maka akan ada Person.prototype |
| 86 | + => Saat membuat sebuah object instance, secara otomatis |
| 87 | + object tersebut adalah turunan dari Constructor.prototype nya |
| 88 | + => Untuk mengakses prototype, pilih sebuah instance (object) |
| 89 | + bisa menggunaan _proto_ |
| 90 | + => Prototype selalu memiliki parent, artinya dia adalah turunan, |
| 91 | + parent tertinggi adalah Object prototype |
| 92 | + => Pertanyaanya bagaimana jika ingin melakukan inheritance ke prototype lain ? |
| 93 | + Hal ini juga nbisa dilakukan, namun agak sedikit tricky, |
| 94 | + karena hal ini, sebenarnya untuk JavaScript modern, |
| 95 | + tidak direkomendasikan lagi praktek OOP menggunaan Prototype, |
| 96 | + karena ES6 (EcmaScript 6) sudah dikenalkan kata kunci class yang akan nanti dibahas di chapter tersendiri |
| 97 | + |
| 98 | + |
| 99 | +Cara Kerja Prototype Inheritance |
| 100 | + => Cara property di prototype diakses dari object instance : |
| 101 | + Ketika mengakses property di object instance, pertama akan dicek |
| 102 | + apakah di object tersebut terdapat property tersebut atau tidak, |
| 103 | + jika tidak, maka akan di cek di _proto_(prototype) nya, |
| 104 | + jika masih tidak ada, akan dicek lagi di _proto_(prototype) yang lebih tinggi, |
| 105 | + begitu seterusnya, sampai berakhir di object prototype |
| 106 | + |
| 107 | +Membuat Class |
| 108 | + => Sejak EcmaScript versi 6, diperkenalkan kata kunci baru, |
| 109 | + yaitu class, ini merupakan kata kunci yang digunakan untuk membuat class di JavaScript |
| 110 | + => Dengan kata kunci class, kita tak perlu lagi membuat constructor function untuk membuat |
| 111 | + class |
| 112 | + |
| 113 | +Constructor di Class |
| 114 | + => Karena bentuk constructor function dengan function, |
| 115 | + jadi bisa menambah parameter pada constructor function, lantas bagaiman dengan class ? |
| 116 | + => Di Class juga kita bisa menambah constructor, dimana dengan menggunaan constructor, |
| 117 | + kita juga bisa menambah parameter saat pertama kali membuat objectnya |
| 118 | + => Untuk membuat constructor di class, kita bisa menggunakan kata kunci constructor |
| 119 | + |
| 120 | +Property di Class |
| 121 | + => Sama seperti pada constructor function, |
| 122 | + dalam class pun kita bisa menambahkan property |
| 123 | + => karena hasil akhirnya adalah sebuah object, |
| 124 | + jadi menambkan property di class bisa dilakukan instance objectnya |
| 125 | + |
| 126 | +Method di Class |
| 127 | + => Membuat menthod sebenarnya bisa dilakukan |
| 128 | + dengan cara seperti menambahkan method di constructor function |
| 129 | + => Namun, hal tersebut sebenarnya menambahkan method ke dalam instance object |
| 130 | + => Khusus untuk method sebaiknya kita menambahkan ke prototype, |
| 131 | + bukan ke instance object |
| 132 | + => Untungnya di class, ada cara mudah menambahkan method dan seceara otomatis ditambahkan |
| 133 | + ke prototype |
| 134 | + |
| 135 | +Class Inheritance |
| 136 | + => Sebelumnya kita mengetahui bahwa Prototype mendukung pewarisan, |
| 137 | + walaupun agak sedikit tricky cara pembuatannya |
| 138 | + => Untungnya itu diperbaiki ES6 (EcmaScript 6) dengan fitur class nya |
| 139 | + => Sebuah class bisa melakukan dari class lainnya dengan menggunaan kata kunci extends |
| 140 | + => Di JavaScript, class inheritance sama seperti prototype inheritance, |
| 141 | + hanya bisa memiliki satu parent class |
| 142 | + |
| 143 | +Super Constructor |
| 144 | + => Class inheritance sifatnya seperti Property Inheritance |
| 145 | + => Bagaimana dengan Constructor Inheritance? |
| 146 | + Sebenarnya Constructor hanyalah melakukan eksekusi constructor lain |
| 147 | + dengan tujuan agar property di constructor lain bisa ditambahkan ke instance object ini |
| 148 | + => Dalam kasus ini, jika kita ingin mencapai hasil yang sama, |
| 149 | + kita bisa menggunakan kata kunci super di dalam constructor |
| 150 | + => Kata kunci super digunakan untuk memanggil constructor super class |
| 151 | + => Jika di child class kita membuat constructor, maka kita wajib memanggil parent constructor, |
| 152 | + walaupun di parent tidak ada constructor |
| 153 | + |
| 154 | +Super Method |
| 155 | + => Selain digunakan untuk memanggil constructor milih parent class, |
| 156 | + kata kunci super juga bisa digunakan untuk mengakses method parent class |
| 157 | + => Caranya bisa menggunakan super titik nama functionnya |
| 158 | + => Dengan kata lain, supert sebenarnya adalah reference ke parent prototype, |
| 159 | + sama seperti _proto_ |
| 160 | + |
| 161 | +Getter & Setter |
| 162 | + => Class juga mendukung pembuatan getter & Setter |
| 163 | + => Perlu diingat, getter & setter ini akan berasa di prototype, |
| 164 | + bukan di instance object |
| 165 | + |
| 166 | +Class field |
| 167 | + => Biasanya, saat kita ingin menambahkan field (property yang berisikan value), |
| 168 | + kita biasanya tambahkan di constructor |
| 169 | + => Namun, ada proposal di EcmaScript yang mengajukan pembuatan public class field |
| 170 | + di tempatkan di luar constructor, selevel dengan penempatan method |
| 171 | + => Proposal ini masih belum final, namun beberapa browser sudah mendukungnya |
| 172 | + https://github.com/tc39/proposal-class-fields |
| 173 | + |
| 174 | +Public Class field |
| 175 | + => Dalam proposal tersebut juga disebutkan |
| 176 | + bahwa EcmaScript akan mendukung access modifier public dan private |
| 177 | + => Public artinya diakses dari luar class, |
| 178 | + dan private hanya bisa diakses dari dalam class saja |
| 179 | + => Private class field akan kita bahas di chapter selanjutnya |
| 180 | + => Untuk membuat public class field, kita bisa langsung buat nama field dengan valuenya |
| 181 | + selevel dengan method |
| 182 | + => Jika kita tidak memasukkan vaule ke dalam field tersebut, |
| 183 | + artinya field tersebut memilik value undefined |
| 184 | + |
| 185 | +Private Class field |
| 186 | + => Secara default, saat kita menambahkan field, |
| 187 | + maka field tersebut bisa diakses dari manapun |
| 188 | + => Jika kita ingin menggunakan field yang bersifat private |
| 189 | + (hanya bisa diakses di dalam class), kita bisa menggunakan tanda "#" sebelum nama fieldnya |
| 190 | + => Ini dinamakan private class field, dan hanya bisa diakses dari dalam class saja; |
| 191 | + |
| 192 | +Private Method |
| 193 | + => Sama seperti field, terdapat proposal juga |
| 194 | + untuk menambah fitur private method di EcmaScript |
| 195 | + => Dengan demikian, access modifier private juga bisa digunakan di method |
| 196 | + => Caranya sama, dengan menambahkan tanda "#" diawal method, |
| 197 | + maka secara otomatis method tersebut adalah Private |
| 198 | + => Ingat fitur ini masih dalam tahapan, belum benar-benar menjadi standat EcmaScript, |
| 199 | + jadi kemungkinan tidak semua browser mendukung fitur ini |
| 200 | + https://github.com/tc39/proposal-private-methods |
| 201 | + |
| 202 | +Operator InstanceOf |
| 203 | + => Kadang ada kasus kita ingin mengecek apakah sebuah object merupakan instance dari class |
| 204 | + tertentu atau bukan |
| 205 | + => Kita tidak bisa menggunaan operator typeOf, |
| 206 | + karena object dari class, |
| 207 | + jika kita gunakan operator typeOf, hasilnya adalah "Object" |
| 208 | + => Operator InstanceOf akan menghasilkan boolean, |
| 209 | + true jika benar object tersebut adalah instance objectnya, atau false jika bukan |
| 210 | + |
| 211 | +Operator instanceof di Class Inheritance |
| 212 | + => Operator instanceof mendukung class inheritance, |
| 213 | + artinya instanceof juga bisa digunakan untuk mengecek, |
| 214 | + apakah sebuah object adalah instance dari class tertentu, |
| 215 | + atau turunan dari class tertentu? |
| 216 | + |
| 217 | +Kata kunci Static |
| 218 | + => Static adalah kata kunci yang bisa kita tambahkan sebelum field atau method, |
| 219 | + biasanya ketika kita membuat field atau method, |
| 220 | + maka secara otomatis field akan menjadi property di instance object, |
| 221 | + dan method akan menjadi function di prototype |
| 222 | + => Jika kita tambahkan static, maka hal itu tidak terjadi |
| 223 | + |
| 224 | +Static Class field |
| 225 | + => Jika kita tambahkan static dalam class field, |
| 226 | + secara otomatis field tersebut bukan lagi milik instance object, |
| 227 | + melainkan milik class nya itu sendiri |
| 228 | + => Biasanya static digunakan jika ingin membuat utility field atau function |
| 229 | + => Cara mengakses static class field pun tidak lagi lewat object, |
| 230 | + melainkan lewat class nya |
| 231 | + => Static class field bisa diartikan sifatnya global, |
| 232 | + tidak peduli diakses dimana atau siapa yang mengakses, |
| 233 | + hasilnya akan sama |
| 234 | + |
| 235 | +Static Method |
| 236 | + => Kata kunci static juga tidak hanya bisa ditambahkan di field, tapi juga di Method |
| 237 | + => Jika kita tambahkan di method, artinya method tersebut jadi milik class nya, bukan prototype |
| 238 | + => Dan untuk mengakses method tersebut, kita juga bisa lakukan seperti mengakses static class field |
| 239 | + |
| 240 | +Error |
| 241 | + => Saat membuat aplikasi, sudah tentu kita tidak akan terhindar dari yang namanya Error |
| 242 | + => Di JavaScript, Error merupakan sesuatu yang sudah Standar |
| 243 | + => Banyak selaki class error di JavaScript, |
| 244 | + namun semua class erro di JavaScript selalu berujung di class Error, |
| 245 | + artinya class error adalah superclass untuk semua jenis error di JavaScript |
| 246 | + => Contoh class error yang terdapat di JavaScript |
| 247 | + - Error |
| 248 | + - AggregateError |
| 249 | + - EvalError |
| 250 | + - RangeError |
| 251 | + - ReferenceError |
| 252 | + - SyntaxError |
| 253 | + - TypeError |
| 254 | + - URIError |
| 255 | + - InternalError |
| 256 | + => https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects#error_objects |
| 257 | + |
| 258 | +Throw Error |
| 259 | + => Saat kita membuat instance object dari class Error, |
| 260 | + tidak lantas otomatis terjadi error |
| 261 | + => Kita perlu memberitahu program kita, |
| 262 | + bahwa kita akan mentrigger sebuah error terjadi, |
| 263 | + atau istilahnya adalah melempar error (throw error), |
| 264 | + kita bisa gunakan kata kunci throw, diikuti dengan instance object error nya |
| 265 | + |
| 266 | +Error Handling |
| 267 | + => Saat terjadi error di kode program JavaScript, |
| 268 | + kadang kita tidak ingin program kita berhenti |
| 269 | + => Di JavaScript, kita bisa menangkap jika terjadi error |
| 270 | + => Kita bisa menggunakan try catch statement |
| 271 | + untuk menangkap error |
| 272 | + => Pada block try, kita akan mencoba mengakses kode program yang bisa menyebabkan error, |
| 273 | + dan jika terjadi error, block try akan berhenti dan otomatis masuk ke block catch |
| 274 | + => Jika tidak terjadi error, block catch tidak akan dieksekusi |
| 275 | + |
| 276 | +Kata kunci finally |
| 277 | + => Kadang kita ingin melakukan sesuatu entah itu terjadi error ataupun tidak |
| 278 | + => Dalam try catch, kita bisa menambahkan block finally |
| 279 | + => Block finally ini akan selalu dieksekusi setelah try catch selesai, |
| 280 | + entah terjadi error atau tidak, block finally akan selalu dieksekusi |
| 281 | + |
| 282 | +Try finally |
| 283 | + => Kata kunci finally juga bisa digunakan tanpa perlu menggunaan catch |
| 284 | + => Biasanya ini digunakan dalam kasus tertentu |
| 285 | + |
| 286 | +Class Error Manual |
| 287 | + => Walaupun JavaScript sudah memiliki Standard class Error |
| 288 | + => Namun alangkah baiknya, kita membedakan tiap jenis Error |
| 289 | + => Untuk membuat error sendiri secara manual sangatlah mudah, |
| 290 | + cukup membuat class turunan dari class error |
| 291 | + => Dan jangan lupa tambahkan parameter message, agar bisa dikirimkan ke parameter di constructor class Error |
| 292 | + |
| 293 | +Iterable & Iterator |
| 294 | + => Salah satu fitur terbaru di ES6 (EcmaScript 6) |
| 295 | + adalah Iterable |
| 296 | + => Iterable adalah spesial object yang memiliki standarisasi |
| 297 | + => Dengan mengikuti standarisasi Iterable, secara otomatis kita bisa melakukan iterasi |
| 298 | + terdapat data tersebut dengan menggunaan perulangan for .. typeOf |
| 299 | + => Contoh yang sudah mengikuti standarasi Iterable |
| 300 | + adalah String, Arrray, Object, dan lain-lain. |
| 301 | + |
| 302 | +Cara kerja Iterable dan Iterator |
| 303 | + => Jika kita mengikuti kontrak Iterable, |
| 304 | + maka object yang kita buat akan bisa dilakukan iterasi |
| 305 | + menggunaan for...of |
| 306 | + => Setiap kita melakukan perulangan, object Iterator akan dibuat |
| 307 | + => Hal ini menjadi aman jika kita melakukan iterasi berulang-ulang, |
| 308 | + karena Iterator baru akan dibuat terus-menerus |
0 commit comments