Belajar Dasar Pemrograman JavaScript
Belajar Dasar Pemrograman JavaScript
Pada kelas ini kita akan belajar hal-hal fundamental yang perlu
Anda ketahui tentang bahasa pemrograman JavaScript pada
lingkungan Node JS. Untuk penggunaan JavaScript pada lingkungan
browser, Anda dapat mempelajarinya pada kelas Belajar Dasar
Pemrograman Web.
Beberapa hal yang akan dipelajari pada kelas ini, antara lain:
Setelah mengetahui materi apa saja yang akan dipelajari, mari kita
mulai melangkah ke materi pertama yaitu Pengenalan
JavaScript. Let’s go!
Mekanisme Belajar
Selamat datang di Dicoding Academy. Sebelum memulai belajar di
kelas ini, Anda perlu tahu tahapan dan cara belajar beserta fasilitas
yang tersedia agar proses belajar lebih efektif.
Materi Pembelajaran
Forum Diskusi
Setiap kelas memiliki sebuah forum diskusi yang dapat Anda
gunakan untuk bertanya (dan menjawab) mengenai materi
kelas. Instruktur kami yang terdiri dari Curriculum Developer
dan Academy Code Reviewer siap membantu Anda melalui
forum diskusi ini. Tak hanya kami, Anda pun dapat
berpartisipasi. Untuk meningkatkan retensi ilmu yang Anda
punya, berbagi adalah salah satu kuncinya. Jadi, silakan aktif
dan saling membantu di dalam forum.
Daftar Referensi
[1] Indeed. “Gaji di Indonesia - gaji rata-rata”
id.indeed.com. https://id.indeed.com/career/front-end-developer/sal
aries?from=top_sb (diakses pada 2 Juni 2022)
[6] M. Lee. "What's the difference between a tilde (~) and a caret
(^) in a npm package.json file?".
michaelsoolee.com. https://michaelsoolee.com/npm-package-tilde-
caret/ (diakses pada 26 Maret 2021)
Pengenalan JavaScript
Sebelum mulai belajar suatu hal yang baru, penting bagi Anda
untuk memahami apa yang akan dipelajari dan apa yang bisa
dilakukan dengannya. Dalam hal ini kita akan mulai mengenal
JavaScript.
Sejarah JavaScript
JavaScript dibuat pada tahun 1995 oleh Brendan
Eich, programmer dari Netscape. Bahasa ini awalnya dinamai
“Mocha” kemudian berubah menjadi “LiveScript”. Pada saat itu
bahasa Java merupakan bahasa pemrograman yang paling populer.
Untuk memanfaatkan kepopulerannya, nama LiveScript pun diubah
menjadi “JavaScript”. Jadi, meskipun namanya mirip, JavaScript
tidak ada hubungannya dengan bahasa pemrograman Java.
Kenapa JavaScript
Jadi, kenapa kita perlu mempelajari JavaScript?
Kode atau teks yang berada di dalam tanda kurung adalah pesan
yang ingin ditampilkan. Pada contoh kode di atas, kita
menggunakan tanda kutip (“”) untuk menandakan bahwa pesan
yang ingin ditampilkan merupakan sebuah string atau teks. Kita
akan membahas mengenai tipe data pada beberapa modul ke
depan. Saat ini kita akan fokus untuk menampilkan teks terlebih
dulu. Sekarang cobalah untuk menampilkan nama Anda sendiri ke
konsol.
1. var yourName;
2. let yourAge;
Comments
Pada materi sebelumnya kita telah membahas bahwa kode yang
kita tulis merupakan kumpulan instruksi yang harus dijalankan oleh
komputer. Salah satu instruksi yang penting adalah memberi tahu
komputer untuk mengabaikan perintah yang kita tulis. Instruksi
yang ditulis dalam suatu program tetapi tidak dijalankan oleh
komputer disebut “comments”.
main.js
1.
*/
Comments
Pada materi sebelumnya kita telah membahas bahwa kode yang
kita tulis merupakan kumpulan instruksi yang harus dijalankan oleh
komputer. Salah satu instruksi yang penting adalah memberi tahu
komputer untuk mengabaikan perintah yang kita tulis. Instruksi
yang ditulis dalam suatu program tetapi tidak dijalankan oleh
komputer disebut “comments”.
main.js
1.
// Ini merupakan komentar satu baris, kode di bawah tidak akan dijalankan
// console.log("Halo!");
Input Reset
Jalankan
Lalu, untuk memberikan komentar lebih dari satu baris kita bisa
menggunakan tanda /* sebagai pembuka komentar dan
tanda */ untuk penutup komentar. Teks apa pun yang berada di
antara tanda tersebut akan dijadikan komentar dan tidak akan
dieksekusi.
Variable
Ketika menulis sebuah program, kita memberi tahu komputer cara
memproses informasi seperti mencetak teks ke layar atau
melakukan operasi perhitungan. Untuk lebih mudah dalam
penggunaan dan pemanggilan data, kita bisa memanfaatkan
variabel. Variabel umumnya digunakan untuk menyimpan informasi
atau nilai yang akan dikelola dalam sebuah program.
Dalam kelas ini, kita akan banyak menggunakan keyword let dan
const. Jika Anda penasaran kenapa var sudah tidak lagi disarankan,
silakan simak diskusi berikut.
1. let lastName;
Tipe Data
Pada materi sebelumnya kita telah belajar tentang variabel untuk
menyimpan nilai. Nilai yang kita tetapkan pada variabel pasti
memiliki tipe data. Tipe data merupakan pengklasifikasian data
berdasarkan jenisnya. Pada JavaScript terdapat beberapa tipe data
sebagai berikut:
Undefined
Tipe data ini terbentuk ketika sebuah variabel tidak memiliki nilai.
Artinya, ketika kita mendeklarasikan variabel tanpa
menginisialisasikan nilainya, variabel tersebut menjadi undefined.
Contoh:
main.js
1.
let x;
console.log(typeof(x));
3
/* output: undefined */
let x = 10;
console.log(typeof(x))
/* output: number */
let y = 17.25;
console.log(typeof(y))
/* output: number */
BigInt
Strings
Tipe data selanjutnya adalah string yang merupakan sebuah teks.
Untuk menetapkan nilai sebagai string pada variabel gunakan
tanda petik satu (‘) atau petik dua (“) di antara teksnya. Contohnya:
confidently';
Boolean
Boolean hanya memiliki dua nilai, yaitu true atau false. Tipe data
ini menjadi kunci utama dalam penentuan logika. Kita akan banyak
menggunakannya nanti dalam materi if/else statement. Untuk
menetapkan nilai boolean pada variabel, gunakan
keyword true atau false seperti di bawah ini.
Kita juga bisa menggunakan operator komparasi seperti lebih dari
(>) atau kurang dari (<). Contohnya:
main.js
1.
const a = 10;
const b = 12;
console.log(isGreater);
console.log(isLess);
10
/* output:
11
false
12
true
13
*/
Null
Symbol
Symbol adalah tipe data baru yang dikenalkan pada ES6. Tipe data
Symbol digunakan untuk menunjukkan identifier yang unik. Ketika
membuat Symbol, kita bisa memberikan deskripsi atau nama
symbol seperti ini:
/* output
false
*/
Operator
Pada materi ini kita akan mempelajari tentang operator yang
terdapat pada JavaScript. Operator dalam bahasa pemrograman
sendiri adalah simbol yang memberi tahu interpreter untuk
melakukan operasi seperti matematika, relasional, atau logika
untuk memberikan hasil tertentu.
Assignment Operator
Pada dasarnya operator ini adalah tanda sama dengan (=), di mana
tanda ini digunakan untuk menginisialisasi nilai pada variabel.
Tempatkan variabel yang ingin diberi nilai di sebelah kiri,
sementara nilainya di sebelah kanan. Di antara keduanya terdapat
operator assignment.
1. x = y;
let y = 5
x += y;
console.log(x);
/* output
15
*/
Comparison Operator
Operator Fungsi
== Membandingkan kedua nilai, tetapi mengabaikan tipe data.
!= Membandingkan kedua nilai haruslah tidak sama, tetapi
mengabaikan tipe data.
=== Membandingkan kedua nilai beserta tipe data.
!== Membandingkan kedua nilai beserta tipe data haruslah tidak
sama.
> Membandingkan dua nilai apakah nilai pertama lebih dari nilai
kedua.
>= Membandingkan dua nilai apakah nilai pertama lebih atau sama
dengan nilai kedua.
< Membandingkan dua nilai apakah nilai pertama kurang dari nilai
kedua.
Operator Fungsi
<= Membandingkan dua nilai apakah nilai pertama kurang atau
sama dengan nilai kedua.
Ketika kita melakukan perbandingan antara dua nilai, JavaScript
akan mengevaluasi kedua nilai tersebut dan mengembalikan
boolean dengan nilai hasil perbandingan tersebut, baik false atau
true. Berikut contohnya:
let a = 10;
let b = 12;
/* output
true
false
*/
Kita sudah mengetahui bahwa setiap nilai pasti memiliki tipe data
baik itu number, string atau boolean. Contohnya sebuah string “10”
dan number 10 merupakan hal yang serupa, tetapi keduanya tidak
benar-benar sama.
Hal inilah yang membedakan antara sama dan identik pada
JavaScript. Jika kita ingin membandingkan hanya dari kesamaan
nilainya kita bisa gunakan == tapi jika kita ingin membandingkan
dengan memperhatikan tipe datanya kita gunakan ===.
const aNumber = 10
/* output
true
false
*/
Logical Operator
main.js
1.
let a = 10;
let b = 12;
/* AND operator */
console.log(a < 15 && b > 10); // (true && true) -> true
console.log(a > 15 && b > 10); // (false && true) -> false
/* OR operator */
11
12
/* NOT operator */
13
14
console.log(!(a < 15 && b > 10)); // !(true && true) -> !(true) -> false
15
16
/* output
17
true
18
false
19
true
20
true
Input Reset
Jalankan
Mungkin sebagian dari kita bertanya, sebenarnya apa kegunaan
dari nilai boolean selain hanya menampilkan nilai true dan false
saja? Pada pembahasan tipe data sudah pernah disebutkan bahwa
boolean merupakan salah satu kunci dari logika pemrograman,
karena boolean dapat mengontrol bagaimana alur program kita
akan berjalan.
If/Else Statement
Setiap hari kita melakukan perhitungan dan perbandingan guna
membuat keputusan, apa pun itu. Contohnya, apakah perlu
mencuci kendaraan ketika cuaca sedang cerah? Apa saja
transportasi online yang bisa dipesan ketika hujan untuk sampai di
tempat tujuan?
if (isRaining) {
console.log("Berangkat kegiatan.");
/* output:
let x = 50;
console.log(x);
} else {
}
/* output
main.js
greeting = "Bonjour!"
}
Pengecekan kondisi akan dilakukan dari statement if paling awal.
Sehingga, ketika nilai language adalah “French”, maka pengecekan
untuk language === “Japanese” tidak akan dilakukan.
/* output
*/
Number 0
BigInt 0n
String kosong seperti “” atau ‘’
null
undefined
NaN, atau Not a Number
if (name) {
console.log(`Halo, ${name}`);
} else {
/* output:
1. switch (expression) {
2. case value1:
3. // do something
4. break;
5. case value2:
6. // do something
7. break;
8. ...
9. ...
10. default:
12. }
Berikut ini adalah contoh kode dari materi if-else yang dikonversi
menjadi statement switch:
switch (language) {
case "English":
break;
case "French":
greeting = "Bonjour!";
break;
case "Japanese":
break;
default:
}
Loop
Ketika menulis program komputer, akan ada situasi di mana kita
perlu melakukan hal yang sama berkali-kali. Misalnya kita ingin
menampilkan semua nama pengguna yang terdaftar di aplikasi
atau sesederhana menampilkan angka 1 sampai 10. Tentunya tidak
praktis jika kita menulis kode seperti berikut:
1. console.log(1);
2. console.log(2);
3. console.log(3);
4. console.log(4);
5. console.log(5);
6. console.log(6);
7. console.log(7);
8. console.log(8);
9. console.log(9);
10. console.log(10);
For loop
Dari beberapa cara melakukan proses loop pada JavaScript, “for”
merupakan salah satu cara yang banyak digunakan. Struktur dasar
dari for tampak seperti berikut:
variabel) {
2. // do something
3. }
main.js
1.
console.log(i);
/* output
1
8
10
For of loop
2. // do something
3. }
console.log(arrayItem)
/* output
Luke
Han
Chewbacca
While and do-while
let i = 1;
console.log(i);
i++;
Bisa dilihat pada kode di atas bahwa looping dengan while tidak
memiliki ketergantungan dengan variabel iterasi seperti pada for
loop. Karena itu, meskipun while dapat melakukan perulangan yang
sama dengan for, while lebih cocok digunakan pada kasus di mana
kita tidak tahu pasti berapa banyak perulangan yang diperlukan.
let i = 1;
do {
console.log(i);
i++;
Infinite loops
Kode berikut ini adalah contoh di mana kondisi infinite loop dapat
terjadi:
While
For
1. let i = 1;
2.
3. while (i <= 5) {
4. console.log(i);
5. }
6. Dapatkah Anda menemukan apa yang salah dari kode di atas
sehingga terjadi infinite loop?
Pada modul ini kita akan membahas tentang tipe data JavaScript
yang dapat menyimpan struktur data yang lebih kompleks.
Beberapa jenis struktur data yang akan kita pelajari, antara lain:
Object
Array
Map
Set
Object
Kali ini kita akan berkenalan dengan tipe data object. Sebuah tipe
data yang sangat berguna dalam pengembangan aplikasi dengan
JavaScript. Object mampu menyimpan nilai dari beragam tipe data
dan membentuk data yang lebih kompleks.
Untuk menetapkan objek pada sebuah variabel kita gunakan tanda
kurung kurawal {}.
Key harus berupa string dan dituliskan sebelum titik dua (:), lalu
diikuti dengan value-nya. Meskipun key merupakan string, kita tidak
perlu menuliskan tanda petik kecuali ada karakter khusus seperti
spasi.
Dalam menuliskan objek, baris baru tidaklah penting dan tidak akan
berpengaruh apa pun. Sehingga lebih baik setiap kita menetapkan
key-value buatlah baris baru untuk memisahkan antar nilainya. Hal
ini akan memudahkan kita dalam membaca dan memahami
struktur data dari sebuah object.
1. const user = {
2. firstName: "Luke",
3. lastName: "Skywalker",
4. age: 19,
5. isJedi: true,
6. };
const user = {
firstName: "Luke",
lastName: "Skywalker",
age: 19,
isJedi: true,
};
Selain dot operator, kita juga bisa mengakses properti dari object
menggunakan bracket atau tanda kurung siku.
1. user[“home world”];
Untuk mengakses key yang memiliki spasi atau karakter khusus
lainnya maka kita perlu menggunakan bracket seperti di atas.
main.js
const user = {
firstName: "Luke",
lastName: "Skywalker",
age: 19,
isJedi: true,
};
/* output
*/
Tunggu dulu. Object spaceship dideklarasikan sebagai const, tetapi
kenapa kita bisa mengubah nilainya?
Array
Array merupakan tipe data yang dapat mengelompokkan lebih dari
satu nilai dan menempatkannya dalam satu variabel. Contoh:
console.log(myArray);
/* output:
*/
1. console.log(myArray[1]);
Jika Anda mengira bahwa konsol akan menampilkan teks ‘Cokelat’,
maka tebakan Anda kurang tepat. Dalam sebuah array, indeks
dimulai dari 0, sehingga ketika kita mengakses data
pada myArray yang berada pada indeks ke-1 artinya data tersebut
merupakan data pada posisi ke-2. Jadi nilai yang akan ditampilkan
pada konsol adalah 42.5.
console.log(myArray[1]);
/* output:
42.5
*/
Lalu, apa yang akan terjadi jika kita berusaha mengakses index di
luar ukuran array-nya? Jika kita mengakses nilai array lebih
dari index-nya, maka hasilnya akan undefined. Index terakhir array
selalu jumlah nilai array - 1.
console.log(myArray[0]);
console.log(myArray[1]);
console.log(myArray[2]);
console.log(myArray[3]);
console.log(myArray[4]);
console.log(myArray[5]);
/* output:
Cokelat
42.5
22
true
Programming
undefined
*/
console.log(myArray);
/* output
*/
Metode lain yang bisa kita gunakan untuk memanipulasi data pada
array adalah shift() dan unshift(). Metode shift() digunakan untuk
mengeluarkan elemen pertama dari array,
sementara unshift() digunakan untuk menambahkan elemen di awal
array.
myArray.shift();
myArray.unshift("Apple");
console.log(myArray);
/* output
*/
Lalu bagaimana jika kita ingin menghapus data dari array? Sama
seperti object, kita bisa menggunakan keyword delete.
delete myArray[1];
console.log(myArray);
/* output
*/
Spread Operator
Masih terkait dengan array, ES6 memiliki fitur menarik untuk
membantu pengelolaan array menjadi lebih mudah, yaitu spread
operator.
2.
3. console.log(favorites);
4.
5. /* output
7. */
main.js
/* output
*/
1. console.log(...favorites);
console.log(allFavorites);
/* output
*/
console.log(allFavorites);
/* output
*/
1. [
2. {
3. "id": 14,
6. },
7. {
8. "id": 51,
11. },
12. {
16. },
17. {
21. }
22. ]
Destructuring Object
Penulisan sintaksis destructuring object pada ES6 menggunakan
object literal ({ }) di sisi kiri dari operator assignment.
const profile = {
2
firstName: "John",
3
lastName: "Doe",
4
age: 18
5
}
6
7
const { firstName, lastName, age } = profile;
8
9
console.log(firstName, lastName, age);
10
11
/* output:
12
John Doe 18
13
*/
statement
Destructuring Array
Destructuring array serupa dengan destructuring object. Object
menggunakan tanda kurung kurawal { } sedangkan array
menggunakan tanda kurung siku [ ]. Perbedaan lainnya adalah
destructuring array bekerja berdasarkan posisi daripada penamaan
propertinya. Berikut contoh dari destructuring array pada ES6:
Map
Map adalah tipe data yang menyimpan koleksi data dengan format
key-value layaknya Object. Yang membedakan adalah Map
memperbolehkan key dengan tipe data apa pun, dibandingkan
Object yang hanya mengizinkan key bertipe String atau Symbol.
Set
Struktur data yang akan kita bahas berikutnya adalah Set. Set
sederhananya merupakan kumpulan nilai (set of values). Hal yang
membedakan Set dengan struktur data yang lain adalah data pada
Set tidak berurutan dan juga tidak diindeks. Selain itu, data di
dalam Set juga bersifat unik dan tidak ada duplikasi. Perhatikan
contoh deklarasi Set di bawah ini:
main.js
Berikut ini adalah beberapa hal yang membedakan antara Map dan
WeakMap:
Key dari WeakMap harus berupa object atau array. Nilai primitif
tidak bisa digunakan sebagai key karena tidak mendukung
garbage collection.
WeakMap memiliki method get(), set(), has(), dan delete().
Namun, WeakMap tidak termasuk kategori iterable sehingga
tidak memiliki method keys(), values(), atau forEach().
WeakMap juga tidak memiliki property size. Ini karena ukuran
WeakMap dapat berubah karena proses garbage collection.
Masih bingung? Mari kita lihat contoh kode dan perbedaan antara
Map dan WeakMap.
Pengenalan Function
Pada modul ini salah satu konsep yang tidak kalah penting pada
JavaScript, yaitu Function.
Declaring Function
Fungsi merupakan bagian penting dalam bahasa pemrograman.
Tanpa sadar, sebenarnya kita sudah menggunakan sebuah fungsi
pada contoh kode yang ada
sebelumnya. log() pada console.log() merupakan sebuah function
yang berguna untuk menampilkan data pada konsol. Tapi
sebenarnya apa itu function? Bagaimana ia bisa bekerja?
1. function multiply(a, b) {
2. return a * b;
3. }
1. multiply(3, 4);
function greeting() {
console.log("Good Morning!")
greeting();
/* output
Good Morning!
*/
Tetapi jika sebuah fungsi hanya menjalankan baris kode yang sama
dirasa kurang fungsional, bukan? Kita dapat membuat fungsi
tersebut untuk menerima dan memanfaatkan parameter untuk
mengubah perilaku dari fungsinya.
5. console.log(`Bonjour ${name}!`);
6. } else {
8. }
9. }
console.log(`Bonjour ${name}!`);
} else {
function multiply(a, b) {
return a * b;
console.log(result)
/* output
20
*/
} else {
console.log(greetingMessage);
/* output
Bonjour Harry!
*/
Expression Function
} else {
console.log(greeting('Ron', 'English'));
/* output
*/
Function Parameter
Pada materi sebelumnya, kita telah berkenalan dengan fungsi yang
merupakan suatu blok kode yang dapat menerima input dan
menghasilkan output tertentu. Input ke dalam sebuah fungsi
dikirimkan melalui parameter.
1. function multiply(a, b) {
2. return a * b;
3. }
1. multiply(3, 4);
Parameter dari fungsi dapat berupa tipe data apa pun, mulai dari
string, number, object, bahkan fungsi lain.
Jika parameter dari fungsi adalah sebuah object, kita juga bisa
memanfaatkan destructuring object untuk mendapatkan nilainya.
Contohnya seperti berikut:
const user = {
id: 24,
displayName: 'kren',
fullName: 'Kylo Ren',
};
console.log(`${displayName} is ${fullName}`);
introduce(user);
/* output
*/
Default Parameters
console.log(`${baseNumber}^${exponent} = ${result}`);
}
exponentsFormula(2);
/* output
2^undefined = NaN
*/
Seperti yang kita lihat pada contoh kode di atas, ketika argumen
lebih sedikit dari parameternya, maka parameter yang tidak
terdefinisi akan bernilai undefined. Sebagai solusi jika
memungkinkan, kita bisa memberikan nilai default pada parameter.
Nilai ini akan digunakan jika kita tidak memasukkan parameter.
console.log(`${baseNumber}^${exponent} = ${result}`);
exponentsFormula(3);
/* output
3^2 = 9
*/
Variable Scope
Sejauh ini kita sudah mengenal function. Setelah kita memisahkan
kode ke dalam blok atau fungsi terpisah, ada satu hal penting yang
perlu kita tahu, yaitu variable scoping. Ada banyak keadaan di
mana kita membutuhkan variabel untuk diakses di seluruh script
yang kita buat. Tetapi ada juga keadaan di mana kita ingin variabel
tersebut hanya dapat diakses pada cakupan fungsi dan fungsi
turunannya saja.
2. const a = 'a';
3.
4. function parent() {
6. const b = 'b';
7.
8. function child() {
11. }
12. }
main.js
1.
function multiply(num) {
return total;
let total = 9;
8
9
console.log(total)
10
11
/* output
12
400
13
*/
Input Reset
Jalankan
Perlu kita perhatikan, jika kita lupa menuliskan keyword let, const,
atau var pada script ketika membuat sebuah variabel, maka
variabel tersebut akan menjadi global.
Di modul ini kita akan membahas beberapa hal terkait OOP, seperti:
Object-Oriented Programming
Object-Oriented Programming (OOP) adalah salah satu paradigma
dalam pemrograman yang berfokus pada pembuatan sebuah objek
dan interaksi dengan objek-objek tersebut. Di OOP, objek
merupakan sebuah entitas yang terdiri dari dua hal, yakni
properties dan methods.
Object Mobil
Properties Merek
Warna
Kecepatan maksimal
Nomor rangka
Methods Maju
Mundur
Belok
1. const car = {
2. // properties
3. brand: 'Ford',
4. color: 'red',
5. maxSpeed: 200,
6. chassisNumber: 'f-1',
7. // methods
8. drive: () => {
9. console.log('driving');
10. },
12. console.log('reversing');
13. },
15. console.log('turning');
16. }
17. }
18.
Mari kita angkat sebuah masalah baru dari contoh kode di atas.
Bagaimana jika Anda ingin membuat objek dua mobil baru dengan
nilai yang berbeda? Haruskah Anda mendefinisikan properti dan
method yang sama secara berulang seperti contoh kode di bawah
ini?
1. const car = {
2. brand: 'Ford',
3. color: 'red',
4. maxSpeed: 200,
5. chassisNumber: 'f-1',
6. drive: () => {
7. console.log('driving');
8. },
9. reverse: () => {
10. console.log('reversing');
11. },
13. console.log('turning');
14. }
15. }
16.
23. console.log('driving');
24. },
26. console.log('reversing');
27. },
29. console.log('turning');
30. }
31. }
32.
39. console.log('driving');
40. },
41. reverse: () => {
42. console.log('reversing');
43. },
45. console.log('turning');
46. }
47. }
Kami rasa kode di atas sungguh tidak efektif. Bagaimana jika ada
banyak mobil yang harus Anda buat? Contoh, Anda membangun
aplikasi yang memiliki entitas pelanggan. Jika Anda menggunakan
cara di atas, mampukah Anda membuat objek pelanggan jika
aplikasi sudah digunakan oleh 100 pelanggan?