Fitur Tambahan dari Kelas dalam JavaScript

Fitur Tambahan dari Kelas dalam JavaScript

Dalam artikel ini, kami akan menjelaskan fitur tambahan dari kelas dalam JavaScript.

YouTube Video

Fitur Tambahan dari Kelas dalam JavaScript

Properti Pribadi dalam JavaScript

Dalam JavaScript, properti pribadi adalah properti yang hanya dapat diakses di dalam objek atau kelas. Ini memungkinkan desain kode yang lebih aman dan kokoh dengan menyediakan enkapsulasi, sehingga modifikasi langsung atau referensi dari kode luar tidak mungkin dilakukan.

Diperkenalkan dalam ECMAScript 2020 (ES11) pada tahun 2020, penggunaan # (hash) untuk mendefinisikan field privat di dalam kelas mulai digunakan. Ini menyediakan cara yang lebih jelas, menggantikan konvensi privat tradisional dalam JavaScript (seperti nama variabel yang diawali dengan garis bawah).

Keuntungan dari Properti Pribadi

Berikut adalah keuntungan dari properti privat.

  • Enkapsulasi: Menyembunyikan keadaan internal dari luar dan menjaga konsistensi data.
  • Keamanan: Mencegah properti dari modifikasi tidak sengaja oleh kode luar.
  • Peningkatan Pemeliharaan: Menyembunyikan implementasi objek atau kelas dan memperjelas antarmuka yang ditampilkan ke luar.

Cara Menggunakan Properti Pribadi

Mendefinisikan Properti Pribadi di Dalam Kelas

Field pribadi didefinisikan menggunakan nama yang diawali dengan #. Field ini tidak dapat diakses langsung dari objek instance dari kelas atau subclass-nya.

 1class Person {
 2    // Define private property
 3    #name;
 4
 5    constructor(name) {
 6        this.#name = name;
 7    }
 8
 9    // Method to access the private property
10    getName() {
11        return this.#name;
12    }
13
14    // Method to change the private property
15    setName(newName) {
16        this.#name = newName;
17    }
18}
19
20const john = new Person("John");
21console.log(john.getName()); // John
22
23// Cannot access private property directly
24console.log(john.#name); // SyntaxError: Private field '#name' must be declared in an enclosing class

Pada kode di atas, #name adalah properti pribadi yang tidak dapat diakses langsung dari luar kelas Person. Anda hanya dapat mengakses atau mengubah nama melalui metode getName dan setName.

Mendefinisikan Metode Pribadi

Seperti properti pribadi, metode pribadi juga didefinisikan dengan nama yang diawali dengan #. Metode pribadi hanya dapat dipanggil dari dalam kelas.

 1class Counter {
 2    #count = 0;
 3
 4    increment() {
 5        this.#count++;
 6        this.#logCount(); // Calling private method
 7    }
 8
 9    // Private method
10    #logCount() {
11        console.log(`Current count: ${this.#count}`);
12    }
13}
14
15const counter = new Counter();
16counter.increment(); // Current count: 1
17
18// Cannot access private method directly
19counter.#logCount(); // SyntaxError: Private field '#logCount' must be declared in an enclosing class

Di sini, #logCount didefinisikan sebagai metode pribadi dan tidak dapat diakses dari luar kelas. Metode ini hanya digunakan di dalam kelas.

Keuntungan dan Pertimbangan dari Properti Pribadi

Keuntungan

  • Karena tidak dapat diakses langsung dari luar kelas, perubahan atau operasi yang tidak diinginkan dapat dicegah.
  • Karena bagian yang tidak terlihat dari luar dapat disembunyikan dengan baik, Anda dapat mengelola bagian yang diekspos sebagai API dengan jelas.

Catatan

  • Karena bidang privat sepenuhnya tersembunyi dari luar kelas, proses pengujian dan debugging bisa menjadi sulit. Oleh karena itu, penting untuk menyediakan API yang dapat diuji secara menyeluruh pada tahap desain.
  • Bidang privat berperilaku berbeda dari bagian lain dalam JavaScript dengan karakteristik berbasis prototipe karena mereka unik untuk setiap instance.

Implementasi Pseudonim Tradisional untuk Properti Privat

Sebelum pengenalan bidang privat menggunakan #, JavaScript tidak memiliki sintaks resmi untuk properti privat. Oleh karena itu, di masa lalu, properti pseudo-privat diimplementasikan dengan cara berikut.

Konvensi menggunakan garis bawah

Pengembang secara konvensional mengindikasikan 'privat' dengan menambahkan garis bawah di awal nama variabel.

 1class Car {
 2    constructor(brand) {
 3        this._brand = brand; // Using an underscore to indicate private
 4    }
 5
 6    getBrand() {
 7        return this._brand;
 8    }
 9}
10
11const car = new Car("Toyota");
12console.log(car.getBrand()); // Toyota
13console.log(car._brand); // Toyota (Accessible from outside)

Metode ini hanyalah sebuah 'konvensi', dan dalam praktiknya, properti tersebut tetap dapat diakses dari luar.

Implementasi properti privat menggunakan penutupan (closure)

Pencapaian properti privat juga memungkinkan dengan menggunakan penutupan (closure) dalam lingkup fungsi.

 1function createPerson(name) {
 2    let _name = name; // Private variable within function scope
 3
 4    return {
 5        getName: function() {
 6            return _name;
 7        },
 8        setName: function(newName) {
 9            _name = newName;
10        }
11    };
12}
13
14const person = createPerson("Alice");
15console.log(person.getName()); // Alice
16person.setName("Bob");
17console.log(person.getName()); // Bob
18
19// Cannot access directly from outside
20console.log(person._name); // undefined

Dengan metode ini, variabel _name terkunci dalam lingkup fungsi dan tidak dapat diakses langsung dari luar.

Ringkasan

Properti privat dalam JavaScript sangat efektif dalam menyediakan enkapsulasi pada desain kelas dan objek, membantu melindungi data dengan aman. Notasi # untuk bidang privat yang dikenalkan di ES2020 memberikan metode manajemen privasi yang lebih jelas dan aman dibandingkan konvensi tradisional dan penutupan (closure).

Optional Chaining dalam JavaScript

Optional Chaining adalah sintaks yang sangat berguna dalam JavaScript untuk mengakses properti dari objek yang bersarang dalam. Ini meningkatkan keterbacaan dan pemeliharaan kode dengan memungkinkan akses yang aman tanpa harus memeriksa secara individual keberadaan properti tertentu.

Sintaks dasar Optional Chaining

Optional Chaining dapat digunakan dengan menempatkan ? sebelum tanda titik (.) atau notasi kurung yang digunakan untuk mengakses properti. Notasi ini mengembalikan undefined ketika properti yang dilalui adalah null atau undefined, memungkinkan program untuk melanjutkan proses dengan aman tanpa menghasilkan kesalahan.

Contoh:

 1const user = {
 2    name: 'John',
 3    address: {
 4        street: '123 Main St',
 5        city: 'New York'
 6    }
 7};
 8
 9// Without using optional chaining
10const city = user && user.address && user.address.city;
11console.log(city);  // New York
12
13// Using optional chaining
14const cityWithOptionalChaining = user?.address?.city;
15console.log(cityWithOptionalChaining);  // New York

Dalam contoh ini, kita mengakses address dan properti city dari objek user. Tanpa menggunakan optional chaining, Anda perlu melakukan beberapa pemeriksaan keberadaan, tetapi dengan optional chaining, Anda dapat mengakses properti dengan aman hanya dengan satu pernyataan.

Menggunakan Optional Chaining dengan array dan fungsi

Optional chaining tidak hanya berlaku untuk properti objek, tetapi juga elemen array dan panggilan fungsi.

Contoh dengan array:

1const users = [{ name: 'Alice' }, { name: 'Bob' }];
2
3// Accessing the non-existent third element
4const thirdUser = users[2]?.name;
5console.log(thirdUser);  // undefined

Contoh dengan fungsi:

 1const user = {
 2    greet: function() {
 3        return 'Hello!';
 4    }
 5};
 6
 7// Call the function only if greet exists
 8const greeting = user.greet?.();
 9console.log(greeting);  // Hello!
10
11// Return undefined if greet does not exist
12const nonExistentGreeting = user.nonExistentMethod?.();
13console.log(nonExistentGreeting);  // undefined

Menggabungkan Optional Chaining dengan nilai default

Saat menggunakan optional chaining, umum untuk menggunakan operator logis OR (||) atau operator nullish coalescing (??) untuk menentukan nilai default jika properti tidak ada.

Contoh:

 1const user = {
 2    name: 'John',
 3    address: {
 4        city: 'New York'
 5    }
 6};
 7
 8// Set a default value for a non-existent property
 9const state = user?.address?.state || 'Unknown';
10console.log(state);  // Unknown
11
12// Example using the nullish coalescing operator
13const zipCode = user?.address?.zipCode ?? '00000';
14console.log(zipCode);  // 00000

Operator || menganggap false, 0, '', dll., sebagai falsy, sedangkan operator ?? hanya menggunakan nilai default jika operand adalah null atau undefined.

Manfaat Optional Chaining

  • Akses aman ke objek bersarang: Dengan menggunakan optional chaining, Anda tidak perlu lagi melakukan pemeriksaan keberadaan eksplisit, membuat kode lebih ringkas.
  • Menghindari kesalahan: Ini dapat mencegah kesalahan saat runtime bahkan jika suatu properti bernilai null atau undefined.
  • Meningkatkan keterbacaan dan pemeliharaan: Terutama saat bekerja dengan banyak objek bersarang, keterbacaan kode meningkat secara signifikan.

Peringatan saat menggunakan Optional Chaining

  • Penggunaan optional chaining yang terlalu sering dapat menjadi tanda bahwa desain struktur data terlalu rumit. Anda sebaiknya berusaha untuk memiliki model data yang sederhana.
  • Karena beberapa browser lama dan mesin JavaScript tidak mendukungnya, Anda mungkin perlu menggunakan polyfill atau transpiler.

Kesimpulan

Optional chaining adalah fitur yang kuat yang menyederhanakan akses aman ke properti dan fungsi dari objek bersarang di JavaScript. Ini sangat efektif saat mengakses struktur data yang bersarang dalam, membantu mencegah kesalahan dan meningkatkan keterbacaan kode.

Anda dapat mengikuti artikel di atas menggunakan Visual Studio Code di saluran YouTube kami. Silakan periksa juga saluran YouTube kami.

YouTube Video