Properti "prototype"
adalah properti yang banyak digunakan oleh Javascript itu sendiri. Semua konstruktor fungsi menggunakannya.
Pertama kita akan melihat lebih lengkapnya dan bagaimana cara menggunakannya untuk menambah kemampuan dari objek-objek bawaan.
Object.prototype
katakan kita mengeluarkan sebuah objek kosong:
let obj = {};
alert[ obj ]; // "[object Object]" ?
Dimanakah kode yang menghasilkan string "[object Object]"
? Itu adalah metode bawaan toString
, tapi diamanakah itu berara? obj
tidak berisi apapun!
…Tapi notasi pendek dari obj = {}
sama seperti obj = new Object[]
, dimana Object
adalah fungsi konstruktor objek bawaan, dengan properti prototype
nya sendiri yang mereferensi sebuah objek besar toString
dan metode lainnya.
Inilah yang terjadi:
Ketika new Object[]
dipanggil [atau sebuah objek literal {...}
dibuat], [[Prototype]]
nya disetel ke Object.prototype
mengikuti aturan yang telah kita bahas di bab sebelumnya:
Jadi ketika obj.toString[]
dipanggil metodenya dibawa dari Object.prototype
.
Kita bisa periksa seperti ini:
let obj = {};
alert[obj.__proto__ === Object.prototype]; // true
alert[obj.toString === obj.__proto__.toString]; //true
alert[obj.toString === Object.prototype.toString]; //true
Ingat bahwa disana sudah tidak ada lagi [[Prototype]]
didalam rantai diatas Object.prototype
:
alert[Object.prototype.__proto__]; // null
prototype bawaan lainnya
Objek bawaan lainnya seperti Array
, Date
, Function
dan lainnya juga tetap menyimpan metode didalam prototype.
Contoh, ketika kita membuat sebuah array [1, 2, 3]
, konstruktor bawaan new Array[]
digunakan secara internal. Jadi Array.prototype
menjadi prototype miliknya dan menyediakan metode-metode.
Itu akan membuatnya menjadi efisien dalam penggunaan memori.
Sebagaimana spesifikasinya, semua prototype bawaan memiliki Object.prototype
diatasnya. Itulah kenapa beberapa orang berkata bahwa “semuanya diwarisi dari objek”.
Ini adalah gambar keseluruhan [memasangkan 3 fungsi]:
Sekarang kita cek prototypenya secara manual:
let arr = [1, 2, 3];
// apakah diwarisi dari Array.prototype?
alert[ arr.__proto__ === Array.prototype ]; // true
// maka dari Object.prototype?
alert[ arr.__proto__.__proto__ === Object.prototype ]; // true
// dan null diatasnya.
alert[ arr.__proto__.__proto__.__proto__ ]; // null
Beberapa metode didalam prototype mungkin tumpang
tindih, contoh, Array.prototype
memiliki toString
nya sendiri yang menyusun elemen yang dipisahkan dengan koma:
let arr = [1, 2, 3]
alert[arr]; // 1,2,3