Objek

Objek adalah jenis data diskret dengan cara yang sama seperti setiap primitif adalah jenis data, dengan satu perbedaan penting: tidak seperti primitif, objek dapat diubah. Objek dapat berisi data yang terkait dengan ID, seperti variabel, tetapi jenis data object-nya tetap dapat dipertahankan, apa pun data yang ada di dalamnya.

Selain primitif, semua nilai JavaScript adalah objek, meskipun karena literal primitif pun menampilkan perilaku seperti objek karena pewarisan prototipe, sering kali dikatakan bahwa JavaScript pada dasarnya terdiri dari objek.

Literal objek adalah sepasang tanda kurung kurawal yang mengelilingi nol atau beberapa pasangan nilai kunci yang disebut "properti", yang dapat berisi nilai JavaScript apa pun.

{
    "myProperty" : true
}

Kunci properti dapat berupa simbol atau string. Seperti saat menetapkan ID ke suatu variabel, string yang digunakan sebagai kunci properti harus dapat diprediksi dan deskriptif:

let carAttributes = {
    "color" : "red"
};

carAttributes
> Object { color: "red" }

Kunci properti memerlukan literal string tunggal (') atau tanda kutip ganda ("), bukan literal template:

let carAttributes = {
    `keyString` : false
};
> Uncaught SyntaxError: expected property name, got template literal

Nilai properti dapat berupa jenis data apa pun. Properti objek sendiri dapat berisi objek dengan propertinya sendiri:

let myObject = {
    'key' : {
        'subkey' : true,
        'othersubkey' : false
    }
};

myObject;
> Object { key: Object { subkey: true, othersubkey: false } }

Jika nilai properti adalah fungsi, properti tersebut disebut "metode".

const myObject = {
    "myProperty" : true,
    myMethod() {
        console.log( "This is a method." );
    }
}

myObject.myProperty;
> true

myObject.myMethod();
> "This is a method."

Anda juga dapat membuat objek menggunakan kata kunci new:

let myObject = new Object();

Pada contoh sebelumnya, literal objek yang baru dibuat telah ditetapkan ke variabel. Hal ini tidak diperlukan, karena seperti jenis data lainnya, Anda dapat menggunakan objek tanpa ID di mana pun objek diharapkan. Namun, literal objek memerlukan tanda kurung dalam konteks apa pun yang bisa membingungkan sebagai pernyataan blok, mengingat bahwa dua sintaksis kurung kurawal bersama ({}). Memulai variabel tidak memerlukan ini.

{ "value" : 2 }
> Uncaught SyntaxError: unexpected token: ':'

({ "value" : 2 })
> Object { value: 2 }

let valObj = { "value" : 2 };

valObj;
> Object { value: 2 }

Tidak seperti primitif, tidak ada perbedaan yang berarti dalam hasil pembuatan objek menggunakan new Object() dan pembuatan literal objek, karena hasil dalam kedua kasus tersebut akan berupa objek dengan properti yang diwarisi dari prototipe Object. Namun, ada satu perbedaan praktis antara kedua sintaksis tersebut.

Kata kunci new harus menentukan objek kosong yang nantinya diisi dengan data:

let myObject = new Object();

myObject.booleanValue = true;
myObject.stringValue = "My string.";

Literal objek dapat diisi dengan data saat dibuat:

let myObject = {
    'booleanValue' : true,
    'stringValue' : "My string."
};

Meskipun hanya memiliki sedikit penggunaan praktis, new Object() dapat digunakan untuk mengubah nilai data primitif menjadi Objek dengan jenisnya masing-masing, seperti yang ditampilkan menggunakan kata kunci new bersama dengan fungsi konstruktor. Misalnya, kode berikut secara fungsional setara dengan new Number( 10 ):

let myObject = new Object( 10 );

myObject;
> Number { 10 }

Nilai null dan undefined menghasilkan objek kosong, yang secara fungsional identik dengan memanggil new Object() tanpa memberikan argumen.

Meneruskan literal objek ke new Object() sebagai argumen akan meneruskan literal objek tanpa mengubahnya:

let myObject = new Object( { myValue : 10 } );

myObject;
> Object { myValue: 10 }

Seperti halnya menggunakan konstruktor untuk nilai primitif, menggunakan konstruktor untuk objek jarang memiliki manfaat dibandingkan dengan menggunakan notasi literal objek. Bahkan saat membuat objek kosong yang akan diisi dengan nilai nanti, developer cenderung mendukung notasi literal objek agar lebih praktis.

Menguji pemahaman Anda

Apa jenis notasi yang dapat Anda gunakan untuk menetapkan properti objek?

Notasi titik
Notasi tanda kurung
Notasi periode
Notasi garis

Manakah dari berikut ini yang merupakan sintaksis yang benar untuk mendapatkan nilai myProp

myObj["myProp"];
myObj{"myProp"};
myObj("myProp");