Javascript'in prototip tabanlı bir dil olması ne anlama geliyor?


Yanıtlar:


291

Prototypal mirası , nesne yönelimli kod yeniden kullanımının bir şeklidir . Javascript, prototip mirasını kullanan tek [ana akım] nesne yönelimli dillerden biridir. Diğer tüm nesne yönelimli diller klasiktir.

Olarak klasik kalıtım , programcı bir nesneyi tanımlayan bir sınıf, yazar. Aynı sınıftan birden fazla nesne başlatılabilir, böylece programınızdaki birkaç nesneyi açıklayan bir kodunuz vardır. Daha sonra sınıflar, hiyerarşiye göre düzenlenebilir ve kodun yeniden kullanılmasını sağlar. Daha genel kod, daha düşük seviyeli sınıfların miras aldığı daha üst düzey bir sınıfta saklanır. Bu, bir nesnenin, aynı sınıftaki diğer nesnelerle ve üst sınıflarıyla kod paylaştığı anlamına gelir.

Gelen Prototypal kalıtım formunda, nesneler doğrudan devralan diğer nesnelerden. Sınıflarla ilgili tüm işler ortadan kalkar. Bir nesne istiyorsanız, sadece bir nesne yazarsınız. Ancak kodun yeniden kullanımı hala değerli bir şeydir, bu nedenle nesnelerin bir hiyerarşide birbirine bağlanmasına izin verilir. Javascript'te, her nesnenin onu oluşturan ve bir zincir oluşturan gizli bir bağlantısı vardır. Bir nesneden sahip olmadığı bir özellik istendiğinde, üst nesnesi ... özellik bulunana kadar veya kök nesneye ulaşılana kadar sürekli olarak zincirden yukarı çıkar.

JavaScript'teki her işlevin (nesnelerin kendisidir) aslında bir nesne istendiğinde değer sağlamaktan sorumlu olan "prototip" adlı bir üyesi vardır. Bu üyeye sahip olmak, yapıcı mekanizmasının (nesnelerin işlevlerden oluşturulduğu) çalışmasına izin verir. Bir işlev nesnesinin prototipine bir özellik eklenmesi, nesneyi yapılı nesnenin yanı sıra bu nesneden miras alan tüm nesneler için kullanılabilir hale getirir.

Avantajları

Prototip palet mirasının kodun yeniden kullanılmasının avantajlı bir biçimi olduğuna dair zor ve hızlı bir kural olmayabilir. Kodun yeniden kullanımı avantajlıdır ve prototip miras bu konuda mantıklı bir yöntemdir. Prototip palet mirasının oldukça basit bir kod yeniden kullanımı modeli olduğunu ve bu kodun doğrudan yeniden kullanılabileceğini iddia edebilirsiniz . Ancak klasik diller de bunu başarabilir.

Sidenote: @Andrew Hedges iyi bir noktaya işaret ediyor, aslında çok sayıda prototip dil ​​var. Bu diğerlerinin var olduğunu, ancak hiçbirinin ana akıma yakın bir şey olmadığını belirtmek gerekir. NewtonScript bir süredir çekişe sahip görünüyordu, ancak platformu ile öldü. Bazı modern dilleri prototip yetenekleri ekleyecek şekilde genişletmek de mümkündür.


9
Hey Kelly. JavaScript açık arayla en popüler prototip dil ​​olsa da, diğerleri de vardır: en.wikipedia.org/wiki/Prototype-based_programming#Languages
Andrew Hedges

2
Hey Andrew. İyi bir nokta. Daha açık olmalıydım. Bunu not edeceğim.
keparo


1
Harika bir cevap için +1. Küçük bir yorum: Bana göre, klasik kalıtım prototipten daha "doğrudan" görünüyor. Aslında, prototip nesnesini salt bağlantı olarak görüyorum (diğer nesnelere), oysa derlenmiş bir OOP'de temel sınıfı "doğrudan miras" olarak görüyorum. Bu nedenle, prototip-nesneler kalıtsal olmaktan ziyade birbirine zincirlenir (kalıtım biraz taklittir). Düşüncesi olan var mı?
Mahkum SIFIR

3
@PrisonerZERO: Prototipal mirasın klasikten daha doğrudan olduğunu iddia ediyorum. A nesnesinin işaret ettiği sınıftan miras alan bir sınıfı işaret eden B nesnesi yerine, doğrudan A nesnesini işaret eder ve "Ben sadece o nesne gibiyim, ..." der. Prototipal kalıtımla ilgili en önemli şey ve çoğu insanın içselleştirmesi en zor görünen şey, örnekleri türlerden ayırmamasıdır. Her nesne hem bir tür hem de bir örnektir. İkisi arasındaki ayrımlar yapay ve kasıtlıdır ve genellikle sınıfa yönelik bir zihniyete takılı kalmanın bir belirtisidir.
cHao

54

Prototip tabanlı bir dil, sınıflar ile nesneler arasında ayrım yapmaz: sadece nesneleri vardır. Prototip tabanlı bir dil, şablon olarak kullanılan ve yeni bir nesnenin başlangıç ​​özelliklerini almak için kullanılan bir nesne olan prototip bir nesne kavramına sahiptir. Herhangi bir nesne, oluşturduğunuzda veya çalışma zamanında kendi özelliklerini belirtebilir. Ek olarak, herhangi bir nesne , ikinci nesnenin ilk nesnenin özelliklerini paylaşmasına izin vererek başka bir nesnenin prototipi olarak ilişkilendirilebilir .


6
Çok iyi bir açıklama, ama "ilk özellikleri için şablon" hakkında yorum biraz yanıltıcı. Bir nesneyi başlatırken SONRA prototipini değiştirirseniz, o nesne yine de bu işlevleri alır.
nickf

32

Prototip tabanlı programlama, sınıfların bulunmadığı bir nesne yönelimli programlama stilidir ve prototip görevi gören mevcut nesnelerin klonlanmasıyla davranış yeniden kullanımı (veya sınıf tabanlı dillerde miras) gerçekleştirilir.


Hala böyle mi hissediyorsun? Çünkü eğer öyleyse, bu gerçekten benimle gerçekten "sağlam" tıklamanın ilk açıklamasıdır.
Chazt3n

11

Avantajı / dezavantajı, sınıfları tanımlamaya gerek kalmadan çalışma zamanında yeni tür nesneler oluşturabilmemizdir (statik kod). Çoğu özellik gibi, onu bir avantaj / dezavantaja dönüştürmek geliştiriciye bağlıdır.

Yukarıda mümkündür çünkü nesneler esas olarak java betiğinde çalışır (kapanışlar da).


Dinamik nesneler javascript'in bir yararıdır, ancak javascript'in prototip veya işlevsel bir dil olmasıyla ilgili değildir. Birçok klasik dilde çalışma zamanında dinamik nesneler oluşturabilirsiniz. Kapanışlar da biraz ilgisiz.
keparo

2
Sınıflar mutlaka statik bir kod değildir - sınıfların kendileri olduğu Python'a bakın ve aynı zamanda nesne olan metasınıflardan yapılmıştır.
Tomasz Zieliński

6

Sınıf yapısını bildirmek yerine, aynı türden nesneler oluşturabilir ve nesnenin prototipini kullanarak istediğiniz zaman tanımlarına ekleyebilirsiniz. Bir şeyleri yapmanın normal yolundan daha esnektir.


6

Yeni nesneleri oluşturmak için derleme sırasında bir sınıf yerine çalışma zamanında nesneleri kullanırsanız, bu, herhangi bir ayrıntıyı bilmeden bir nesneyi genişletme olasılığını açar. Tabii ki, kullanıma bağlı olarak oldukça hızlı bir dezavantaj haline gelebilir. Burada dil hakkında herhangi bir varsayımda bulunmuyorum, bu yüzden javascript dışındaki dinamik olmayan diller için de geçerlidir.

myobject.prototype=unkownobject;
myobject.newproperty=1;

Nesneyi hemen hemen her yerden alabilirsiniz; kendi kodunuzu, ağdan, veritabanından, harici bağlantıdan vb.

Bir dilin javascript gibi prototip mirasını uygulamak zorunda olmadığını unutmayın. Javascript'te, bir prototip nesnesi yalnızca mirasçılar arasında özellikleri de paylaşılır. Alternatif, prototipin tüm özelliklerinin yeni nesneye kopyalanmasıdır. Her yaklaşımın farklı durumlarda güçlü yanları vardır. İkincisini daha çok seviyorum ama javascript'in yaptığı şey bu değil.


6

Tüm cevapları okuduktan sonra bu sonuç

1) Nesnelerin doğrudan diğer nesnelerden miras alındığı kalıtım

2) Sınıfları kullanmaz

3) Örnek tabanlı programlama veya sınıfsız prototip odaklı programlama olarak da adlandırılır

4) Davranışların yeniden kullanımı, prototip görevi gören mevcut nesnelerin klonlanmasıyla gerçekleştirilir

5) Yeni nesneden şablon olarak kullanılan nesne başlangıç ​​özelliklerini alır

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.