Şubat 2012'de DÜZENLE: Aşağıdaki cevap artık doğru değil. __proto__, ECMAScript 6'ya "normatif isteğe bağlı" olarak ekleniyor; bu, uygulanması gerekmediği, ancak uygulanıyorsa, verilen kurallara uyması gerektiği anlamına gelir. Bu şu anda çözülmedi, ancak en azından resmi olarak JavaScript'in spesifikasyonunun bir parçası olacak.
Bu soru, yüzeyde göründüğünden çok daha karmaşıktır ve çoğu insanın Javascript iç bilgisine göre maaş notunun ötesinde.
prototype
Bu nesnenin yeni bir alt nesneler oluştururken, bir nesnenin özelliği kullanılır. Bunu değiştirmek nesnenin kendisine yansımaz, daha ziyade bu nesne diğer nesneler için bir kurucu olarak kullanıldığında yansıtılır ve mevcut bir nesnenin prototipini değiştirmede hiçbir faydası yoktur.
function myFactory(){};
myFactory.prototype = someOtherObject;
var newChild = new myFactory;
newChild.__proto__ === myFactory.prototype === someOtherObject; //true
Nesnelerin, geçerli prototipe işaret eden dahili bir [[prototip]] özelliği vardır. Çalışma şekli, bir nesne üzerindeki bir özellik çağrıldığında, nesnede başlayacak ve ardından bir eşleşme bulana kadar veya kök Nesne prototipinden sonra başarısız olana kadar [[prototip]] zincirinde yukarı çıkacaktır. Javascript, nesnelerin çalışma zamanında oluşturulmasına ve değiştirilmesine bu şekilde izin verir; ihtiyacı olanı aramak için bir planı vardır.
__proto__
Mülkiyet (şimdi çok) bazı uygulamalarda bulunmaktadır: Herhangi Mozilla uygulanmasını Bildiğim bütün webkit olanlar, bazı diğerleri. Bu özellik dahili [[prototip]] özelliğine işaret eder ve nesneler üzerinde oluşturma sonrası değişikliklere izin verir. Bu zincirleme arama sayesinde, herhangi bir özellik ve işlev anında prototipe uyacak şekilde geçiş yapacaktır.
Bu özellik, şu anda standartlaştırılmış olsa da, hala JavaScript'in gerekli bir parçası değildir ve onu destekleyen dillerde, kodunuzu "optimize edilmemiş" kategorisine düşürme olasılığı yüksektir. JS motorları, kodu, özellikle çok sık erişilen "sıcak" kodu sınıflandırmak için ellerinden gelenin en iyisini yapmalıdır ve değiştirmek gibi süslü bir şey yapıyorsanız __proto__
, kodunuzu hiç optimize etmezler.
Bu yayınlar https://bugzilla.mozilla.org/show_bug.cgi?id=607863 özellikle mevcut uygulamaları __proto__
ve bunlar arasındaki farkları tartışmaktadır . Her uygulama bunu farklı şekilde yapar, çünkü bu zor ve çözülmemiş bir sorundur. A.) Sözdizimi b.) Ana nesneler (DOM teknik olarak Javascript dışında bulunur) ve c.) Dışında Javascript'teki her şey değiştirilebilir __proto__
. Gerisi tamamen sizin ve diğer tüm geliştiricilerin elinde, bu yüzden neden __proto__
ağrılı bir başparmak gibi dışarı çıktığını anlayabilirsiniz .
Buna __proto__
izin veren bir şey , aksi takdirde imkansızdır: bir nesnenin prototipinin, kurucusundan ayrı olarak çalışma zamanında atanması. Bu önemli bir kullanım durumudur ve __proto__
zaten ölmemiş olan birincil nedenlerden biridir . Harmony'nin formülasyonunda ciddi bir tartışma noktası olması veya yakında ECMAScript 6 olarak bilinmesi yeterince önemlidir. Oluşturma sırasında bir nesnenin prototipini belirleme yeteneği, Javascript'in bir sonraki sürümünün bir parçası olacak ve bu, __proto__
günlerini gösteren zil resmi olarak numaralandırılmıştır.
Kısa vadede, __proto__
onu destekleyen tarayıcıları hedefliyorsanız kullanabilirsiniz (IE'yi değil ve hiçbir IE'yi desteklemeyecek). ES6 2013'e kadar tamamlanmayacağından önümüzdeki 10 yıl boyunca webkit ve moz'da çalışacak.
Brendan Eich - re: ES5'teki yeni Nesne yöntemlerine yaklaşım :
Maalesef ... ama __proto__
nesne başlatıcı kullanım durumu dışında ayarlanabilir (yani, ES5'in Object.create ile benzer şekilde, henüz erişilemeyen yeni bir nesnede), korkunç bir fikir. Bunu __proto__
12 yıl önce tasarlanıp uygulanarak yazıyorum .
... tabakalaşma eksikliği bir sorundur (JSON verilerini bir anahtarla düşünün "__proto__"
). Daha da kötüsü, değişkenlik, uygulamaların ilooping'i önlemek için döngüsel prototip zincirlerini kontrol etmesi gerektiği anlamına gelir. [sonsuz özyineleme için sürekli kontroller gereklidir]
Son olarak, __proto__
mevcut bir nesnede mutasyon , yeni prototip nesnesindeki jenerik olmayan yöntemleri bozabilir ve __proto__
bu, ayarlanan alıcı (doğrudan) nesne üzerinde muhtemelen çalışamaz . Bu sadece kötü bir uygulamadır, genel olarak kasıtlı bir tür kafa karışıklığıdır.