Kısa cevap: nesneyi oluşturan yapıcı özelliğine __proto__bir referanstır prototype.
JavaScript'teki nesneler
JavaScript nesnesi, sıfır veya daha fazla özellik koleksiyonu için yerleşik bir türdür . Özellikler, diğer nesneleri, ilkel değerleri veya işlevleri tutan kaplardır.
JavaScript'teki yapıcılar
Fonksiyonlar (uygulamak düzenli nesnelerdir [[Call]]çağrılabilir olmanın ek özelliği ile ECMA-262 açısından) fakat JavaScript başka bir rol oynar: onlar kurucular (haline fabrikalar aracılığıyla çağrılan eğer nesneler için)new operatör . Böylece yapıcılar diğer dillerdeki sınıflara kaba bir analogudur.
Her JavaScript işlevi aslında prototip tabanlı miras ve paylaşılan özellikleri uygulamak için kullanılan Functionadlı özel bir özelliğe sahip yerleşik işlev nesnesinin bir örneğidir prototype. Bir yapıcı işlevi tarafından oluşturulan her nesnenin, yapıcısının değerine örtülü bir referansı (prototip veya denir __proto__) vardır prototype.
Yapıcı prototypebir çeşit planı yapıcısı tarafından oluşturulan her nesne bir başvuru devralır beri nesneleri oluşturmak için onunprototype .
Prototip zinciri
Bir nesne prototipini internal özelliği [[Prototype]]veya yoluyla belirtir __proto__. İki nesne arasındaki prototip ilişkisi kalıtımla ilgilidir: her nesnenin prototipi olarak başka bir nesnesi olabilir. Prototip nulldeğer olabilir .
__proto__Özellik tarafından bağlanan nesne zincirine prototip zinciri denir . Bir nesnedeki bir özelliğe başvuru yapıldığında, bu başvuru, prototip zincirindeki o adın bir özelliğini içeren ilk nesnede karşılaşılan özelliğe yapılır. Prototip zinciri sanki tek bir nesne gibi davranır.
Bu resme bakın (bu blogdan alınmıştır ):

Bir nesnedeki bir özelliğe erişmeye çalıştığınızda, JavaScript bu nesnede aramayı başlatır ve özellikle karşılaşılana veya __proto__değeri tutarsa, prototipiyle, prototipin prototipiyle vb. Devam eder null.
Prototip zincirini kullanan bu tür kalıtım , sınıf zincirini kullanan diğer dillerle karışıklığı önlemek için genellikle temsilci seçme olarak adlandırılır .
Hemen hemen tüm nesneler örneklerdir Object, çünkü Object.prototypeprototip zincirlerinde sonuncudur. Ama Object.prototypebunun bir örneği değildir Objectçünkü Object.prototype.__proto__değeri tutar null.
Ayrıca, aşağıdaki nullgibi bir prototipi olan bir nesne de oluşturabilirsiniz :
var dict = Object.create(null);
Böyle bir nesne, gerçek bir nesneden daha iyi bir haritadır (sözlük), bu nedenle bu desene bazen dikte deseni ( dikte) denir sözlük için ) .
Not: kullanılarak oluşturulan edebi nesneleri {}örnekleri olan Objectbu yana ({}).__proto__bir referanstır Object.prototype.