Javascript'in en önemli avantajlarından birinin prototip tabanlı bir dil olduğu söyleniyor.
Ancak Javascript'in prototip tabanlı olması ne anlama geliyor ve bu neden bir avantaj?
Javascript'in en önemli avantajlarından birinin prototip tabanlı bir dil olduğu söyleniyor.
Ancak Javascript'in prototip tabanlı olması ne anlama geliyor ve bu neden bir avantaj?
Yanıtlar:
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.
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 .
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.
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).
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.
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