EDIT Februari 2012: jawaban di bawah ini sudah tidak akurat lagi. __proto__ sedang ditambahkan ke ECMAScript 6 sebagai "normatif opsional" yang berarti tidak diharuskan untuk diterapkan tetapi jika demikian, itu harus mengikuti seperangkat aturan yang diberikan. Ini saat ini belum terselesaikan tetapi setidaknya itu akan menjadi bagian resmi dari spesifikasi JavaScript.
Pertanyaan ini jauh lebih rumit daripada yang terlihat di permukaan, dan di luar nilai gaji kebanyakan orang dalam hal pengetahuan tentang internal Javascript.
The prototype
properti dari objek yang digunakan saat membuat objek anak baru dari objek itu. Mengubahnya tidak mencerminkan objek itu sendiri, melainkan tercermin ketika objek itu digunakan sebagai konstruktor untuk objek lain, dan tidak ada gunanya mengubah prototipe objek yang sudah ada.
function myFactory(){};
myFactory.prototype = someOtherObject;
var newChild = new myFactory;
newChild.__proto__ === myFactory.prototype === someOtherObject; //true
Objek memiliki properti [[prototipe]] internal yang mengarah ke prototipe saat ini. Cara kerjanya adalah setiap kali sebuah properti pada sebuah objek dipanggil, ia akan mulai pada objek tersebut dan kemudian naik melalui rantai [[prototipe]] sampai ia menemukan kecocokan, atau gagal, setelah prototipe objek root. Ini adalah bagaimana Javascript memungkinkan untuk pembangunan runtime dan modifikasi objek; itu memiliki rencana untuk mencari apa yang dibutuhkannya.
The __proto__
properti ada di beberapa implementasi (banyak sekarang): setiap pelaksanaan Mozilla, semua yang webkit saya tahu, beberapa orang lain. Properti ini menunjuk ke properti [[prototipe]] internal dan memungkinkan modifikasi pasca-pembuatan pada objek. Semua properti dan fungsi akan langsung beralih agar sesuai dengan prototipe karena pencarian berantai ini.
Fitur ini, meskipun distandarisasi sekarang, masih belum menjadi bagian wajib dari JavaScript, dan dalam bahasa yang mendukungnya memiliki kemungkinan besar untuk menjatuhkan kode Anda ke dalam kategori "tidak dioptimalkan". Mesin JS harus melakukan yang terbaik untuk mengklasifikasikan kode, terutama kode "panas" yang sangat sering diakses, dan jika Anda melakukan sesuatu yang menarik seperti memodifikasi __proto__
, mereka tidak akan mengoptimalkan kode Anda sama sekali.
Posting ini https://bugzilla.mozilla.org/show_bug.cgi?id=607863 secara khusus membahas implementasi saat ini __proto__
dan perbedaan di antara mereka. Setiap implementasi melakukannya secara berbeda, karena ini masalah yang sulit dan tidak terpecahkan. Segala sesuatu di Javascript bisa berubah, kecuali a.) Sintaks b.) Objek host (DOM ada di luar Javascript secara teknis) dan c.) __proto__
. Sisanya sepenuhnya ada di tangan Anda dan setiap pengembang lainnya, jadi Anda dapat melihat mengapa __proto__
menonjol seperti ibu jari yang sakit.
Ada satu hal yang __proto__
memungkinkan hal itu tidak mungkin dilakukan: penunjukan prototipe objek pada waktu proses terpisah dari konstruktornya. Ini adalah kasus penggunaan yang penting dan merupakan salah satu alasan utama __proto__
belum mati. Cukup penting bahwa ini menjadi poin diskusi yang serius dalam perumusan Harmoni, atau segera dikenal sebagai ECMAScript 6. Kemampuan untuk menentukan prototipe suatu objek selama pembuatan akan menjadi bagian dari versi Javascript berikutnya dan ini akan menjadi bel yang menunjukkan __proto__
hari diberi nomor secara resmi.
Dalam jangka pendek, Anda dapat menggunakan __proto__
jika Anda menargetkan browser yang mendukungnya (bukan IE, dan tidak ada IE yang akan mendukungnya). Kemungkinan itu akan berfungsi di webkit dan moz selama 10 tahun ke depan karena ES6 tidak akan selesai hingga 2013.
Brendan Eich - re: Pendekatan metode Objek baru di ES5 :
Maaf, ... tapi dapat diatur __proto__
, terlepas dari kasus penggunaan initialiser objek (yaitu, pada objek baru yang belum dapat dijangkau, analog dengan Object.create ES5), adalah ide yang buruk. Saya menulis ini setelah merancang dan mengimplementasikan settable __proto__
lebih dari 12 tahun yang lalu.
... kurangnya stratifikasi adalah masalah (pertimbangkan data JSON dengan kunci "__proto__"
). Dan lebih buruk, mutabilitas berarti implementasi harus memeriksa rantai prototipe siklik untuk menghindari ilooping. [pemeriksaan konstan untuk rekursi tak terbatas diperlukan]
Akhirnya, mutasi __proto__
pada objek yang sudah ada dapat merusak metode non-umum dalam objek prototipe baru, yang tidak mungkin bekerja pada objek penerima (langsung) yang __proto__
sedang disetel. Ini hanyalah praktik buruk, suatu bentuk kebingungan tipe yang disengaja, secara umum.