Prototipler bir optimizasyondur .
Bunları iyi kullanmanın harika bir örneği jQuery kitaplığıdır. Kullanarak bir jQuery nesnesi elde ettiğiniz her seferinde $('.someClass')
, bu nesnenin düzinelerce "yöntemi" vardır. Kütüphane bunu bir nesneyi döndürerek başarabilir:
return {
show: function() { ... },
hide: function() { ... },
css: function() { ... },
animate: function() { ... },
};
Ancak bu, bellekteki her jQuery nesnesinin aynı yöntemleri içeren düzinelerce adlandırılmış yuvaya sahip olacağı anlamına gelir.
Bunun yerine, bu yöntemler bir prototip üzerinde tanımlanır ve tüm jQuery nesneleri, tüm bu yöntemleri çok düşük çalışma zamanı maliyetiyle elde etmek için bu prototipi "miras alır".
JQuery'nin bunu nasıl doğru yaptığının hayati önem taşıyan bir kısmı, bunun programcıdan gizlenmiş olmasıdır. Kitaplığı kullanırken endişelenmeniz gereken bir şey olarak değil, tamamen bir optimizasyon olarak ele alınır.
JavaScript ile ilgili sorun, yalın yapıcı işlevlerin, arayan kişinin önek olarak bunları eklemeyi hatırlamasını gerektirmesidir, new
aksi halde genellikle çalışmazlar. Bunun için iyi bir sebep yok. jQuery, bu saçmalığı sıradan bir işlevin arkasına saklayarak doğru yapar $
, böylece nesnelerin nasıl uygulandığını umursamak zorunda kalmazsınız.
ECMAScript 5, belirli bir prototipe sahip bir nesneyi rahatça oluşturabilmeniz için standart bir işlev içerir Object.create
. Oldukça basitleştirilmiş bir versiyonu şöyle görünecektir:
Object.create = function(prototype) {
var Type = function () {};
Type.prototype = prototype;
return new Type();
};
Sadece bir yapıcı işlevi yazmanın ve sonra onu çağırmanın acısıyla ilgilenir new
.
Prototiplerden ne zaman kaçınırsınız?
Java ve C # gibi popüler OO dilleriyle kullanışlı bir karşılaştırma yapılır. Bunlar iki tür kalıtımı destekler:
- arayüz Eğer kalıtım,
implement
bir interface
tür sınıf arayüzünün her üyesi için kendi benzersiz uygulamasını sağladığından.
- bazı yöntemlerin varsayılan uygulamalarını sağlayan
extend
bir uygulama mirası class
.
JavaScript'te prototip kalıtım bir tür uygulama mirasıdır. Dolayısıyla, (C # veya Java'da) varsayılan davranışı elde etmek için temel bir sınıftan türetilmiş olduğunuz, daha sonra geçersiz kılmalar yoluyla küçük değişiklikler yaptığınız bu durumlarda, JavaScript'te prototip kalıtım anlamlıdır.
Bununla birlikte, C # veya Java'da arayüzler kullanmanız gereken bir durumdaysanız, JavaScript'te herhangi bir özel dil özelliğine ihtiyacınız yoktur. Arayüzü temsil eden bir şeyi açıkça bildirmeye gerek yoktur ve nesneleri bu arayüzü "uyguluyor" olarak işaretlemeye gerek yoktur:
var duck = {
quack: function() { ... }
};
duck.quack();
Diğer bir deyişle, her bir nesne "türü" kendi "yöntem" tanımlarına sahipse, o zaman bir prototipten miras almanın bir değeri yoktur. Bundan sonra, her türden kaç örnek ayırdığınıza bağlıdır. Ancak birçok modüler tasarımda, belirli bir tipin yalnızca bir örneği vardır.
Ve aslında, birçok kişi tarafından uygulama mirasının kötü olduğu öne sürülmüştür . Yani, bir tür için bazı ortak işlemler varsa, o zaman bir temel / süper sınıfa konulmamaları, bunun yerine nesneyi (leri) ilettiğiniz bazı modüllerde sıradan işlevler olarak ortaya çıkmaları daha net olabilir. onların üzerinde işlem yapmalarını istiyorsun.