- Bab 10 dari 12
- 30 menit
- 1 latihan kode
- 4 soal kuis
Class dan Modules
Di bab ini (8 bagian)
Tujuan bab ini
- Membuat class lengkap dengan
constructor, method, getter/setter, danstatic. - Mewariskan class dengan
extendsdan memanggil induknya lewatsuper. - Memecah kode ke beberapa file dengan
exportdanimport, termasuk beda named dan default export.
Class itu cetakan, objek itu kuenya
Di bab objek kamu sudah bikin objek satu per satu dengan { }. Masalahnya muncul saat kamu butuh puluhan objek dengan bentuk yang sama, misalnya data mahasiswa. Menyalin { nama, nim, perkenalan() {...} } berkali-kali itu capek dan rawan typo.
class (hadir di ES6 atau ES2015) adalah cetakan. Kamu tulis bentuknya sekali, lalu cetak objek sebanyak apa pun dengan new. Objek hasil cetakan disebut instance.
Yang terjadi saat new Mahasiswa("Dini", "0421") dijalankan, langkah demi langkah:
- JavaScript membuat objek kosong baru.
constructordipanggil otomatis, danthismenunjuk ke objek baru itu.- Baris
this.nama = namamengisi properti objek. - Objek yang sudah terisi dikembalikan dan disimpan ke
dini.
Method seperti perkenalan() tidak disalin ke tiap objek. Ia disimpan sekali di Mahasiswa.prototype, lalu dipakai bersama oleh semua instance. Itulah kenapa class disebut "gula sintaksis": di balik layar, JavaScript tetap memakai sistem prototype yang sudah ada sejak dulu. Class hanya membuat penulisannya lebih rapi dan familiar bagi yang pernah belajar Java atau Python.
Dua hal kecil yang beda dari fungsi biasa: class wajib dipanggil dengan new (tanpa new kamu dapat TypeError), dan isi class otomatis berjalan dalam strict mode.
Getter dan setter: properti yang sebenarnya fungsi
Kadang sebuah nilai lebih masuk akal dihitung daripada disimpan. Luas lingkaran, misalnya, selalu bergantung pada jari-jarinya. Getter (get) membuatmu bisa membaca hasil hitungan seperti properti biasa, tanpa tanda kurung.
Setter (set) dipanggil saat kamu menulis dengan =. Ini tempat yang pas untuk validasi. Awalan _ pada _r hanyalah konvensi: tanda "ini urusan internal, jangan diutak-atik dari luar". JavaScript tidak benar-benar melarangnya. Properti privat resmi dengan tanda # baru datang di ES2022, dan kita bahas di bab JavaScript modern.
Static: milik class, bukan milik instance
Method static menempel pada class itu sendiri. Cocok untuk fungsi bantu yang tidak butuh data dari satu objek tertentu.
Contoh nyata yang sudah sering kamu pakai: Math.max(), Array.from(), dan Number.isInteger() semuanya method static.
extends dan super: mewarisi tanpa menyalin
Misalkan mahasiswa Universitas Terbuka punya semua sifat Mahasiswa, ditambah program studi. Daripada menulis ulang, pakai extends.
super punya dua wajah:
| Bentuk | Dipakai di | Artinya |
|---|---|---|
super(...) | constructor class anak | memanggil constructor induk |
super.method() | method mana pun | memanggil versi method milik induk |
Aturan penting: di class anak, super() harus dipanggil sebelum kamu menyentuh this. Alasannya, objeknya baru benar-benar dibuat oleh constructor induk. Menulis this.prodi sebelum super() langsung menghasilkan ReferenceError.
Menulis ulang perkenalan() di class anak disebut override. Versi anak yang dipakai, tapi lewat super.perkenalan() kamu masih bisa meminjam hasil versi induk lalu menambahinya.
Modules: satu file, satu tanggung jawab
Proyek nyata tidak ditulis dalam satu file raksasa. ES6 Modules membuat tiap file punya ruang lingkup sendiri: variabel di satu file tidak bocor ke file lain kecuali kamu export, dan file lain baru bisa memakainya kalau ia import.
File pertama, math.js:
File kedua, app.js:
Bedanya named dan default export:
| Named export | Default export | |
|---|---|---|
| Jumlah per file | boleh banyak | maksimal satu |
| Cara import | pakai { }, nama harus sama | tanpa { }, nama bebas |
| Ganti nama | { keliling as kel } | langsung import apaSaja from |
| Ambil semua | import * as math from "./math.js" | ada di math.default |
Beberapa sifat modul yang perlu kamu tahu:
- Modul dimuat sekali lalu di-cache. Kalau lima file meng-import
math.js, kodenya tetap jalan satu kali. - Modul selalu strict mode.
- Di browser, file utama dipanggil dengan
<script type="module" src="app.js"></script>. Di Node.js, pakai ekstensi.mjsatau"type": "module"dipackage.json. - Karena import/export bersifat statis, bundler seperti Vite atau Webpack bisa membuang fungsi yang tidak pernah di-import. Proses ini disebut tree-shaking.
Catatan untuk latihan di bawah: editor latihan menjalankan satu file saja, jadi tidak ada import. Kamu cukup menulis class-nya langsung.
Kesalahan umum
- Lupa
new.Mahasiswa("Dini")melemparTypeError: Class constructor Mahasiswa cannot be invoked without 'new'. - Memakai
thissebelumsuper(). Di constructor class anak, panggilsuper(...)di baris pertama. - Memanggil getter dengan kurung.
roda.luas()error karenaluashasilnya angka, bukan fungsi. Tulisroda.luas. - Memanggil method static dari instance.
k.tambah(2, 3)gagal; yang benarKalkulator.tambah(2, 3). - Tertukar kurung kurawal saat import.
import { luas } from "./math.js"gagal kalauluasdiekspor sebagai default. Default diimpor tanpa{ }. - Lupa ekstensi
.jspada path import di browser. Browser butuh path lengkap seperti"./math.js".
Rangkuman
classadalah cetakan objek;constructorjalan otomatis saatnew, dan method disimpan bersama di prototype.- Getter dan setter membuat hitungan dan validasi terasa seperti properti biasa;
staticdipanggil dari class, bukan instance. extendsmewariskan class,super()memanggil constructor induk dan wajib datang sebelumthis.- Modules memecah kode per file: named export bisa banyak dan diimpor pakai
{ }, default export cuma satu dan diimpor tanpa{ }.
Slide 29 sampai 31 dari deck JavaScript. Penjelasan lengkapnya ada di mode Baca.

Selesaikan bab ini
- 1. Baca materi
- 2. Latihan kode (1)
- 3. Kuis (4 soal)
Latihan kode: Produk dan produk diskon
Buat dua class:
Produkdenganconstructor(nama, harga), methodinfo()yang mengembalikan"<nama>: Rp<harga>", dan method statictermurah(a, b)yang mengembalikan produk dengan harga lebih kecil.ProdukDiskonyangextends Produk, denganconstructor(nama, harga, persen)(panggilsuper). Tambahkan getterhargaAkhiryang mengembalikanharga - harga * persen / 100, dan overrideinfo()menjadi"<nama>: Rp<hargaAkhir> (diskon <persen>%)".
Contoh: new ProdukDiskon("Kaos", 100000, 20).info() menghasilkan "Kaos: Rp80000 (diskon 20%)".
Cek pemahaman
1Apa yang ditampilkan kode berikut?
class Mahasiswa { constructor(nama) { this.nama = nama; } perkenalan() { return `Saya ${this.nama}`; } } class MahasiswaUT extends Mahasiswa { constructor(nama, prodi) { super(nama); this.prodi = prodi; } perkenalan() { return `${super.perkenalan()} (${this.prodi})`; } } console.log(new MahasiswaUT("Sari", "SI").perkenalan());2Di constructor class anak, kapan `super(...)` harus dipanggil?
3Method `static` bisa dipanggil langsung dari instance, misalnya `new Kalkulator().tambah(2, 3)`.
4`math.js` berisi `export default function luas(r) {...}`. Import mana yang benar?