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 Function
adlı ö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ı prototype
bir ç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 null
değ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.prototype
prototip zincirlerinde sonuncudur. Ama Object.prototype
bunun bir örneği değildir Object
çünkü Object.prototype.__proto__
değeri tutar null
.
Ayrıca, aşağıdaki null
gibi 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 Object
bu yana ({}).__proto__
bir referanstır Object.prototype
.