Javascript — Prototype , Object.create()
Javascript’de Es6 ‘dan önce bir obje ve constructor örneği göstericek olursam;
Burada ki this objemiz Employee objesini gösterir. Buranın dışarısında this’i yazdırırsak window objesini yazdırmış oluruz.
Javascript diğer diller gibi class tabanlı değil prototype tabanlı bir dildir. Ecmascript 6 ile class keywordu gelmiş olsa da arka tarafta bu prototype’lere dönüştürülür.
Prototype’lar da birer objedir. Javascript objelerimizin her birinin içerisinde prototype özelliği bulunmakta. Prototype’ın içerisinde o nesnenin constructor’ı ve gömülen methodları bulunuyor.
Örnekte de görüldüğü gibi eğer Employee den emp1 ve emp2 nesneleri oluşturursak , JS engine otomatik olarak bunların içine prototype ekler.(Employee prototype). Ve bu 2 nesne(emp1 ve emp2) aynı prototype’a bakar. Burada çıkarılacak sonuç aynı 2 işi yapan function’lar yazacaksak bunları prototype’a gömeriz. Böylece her oluşturduğumuz nesne için o function’lar memory de yer kaplamaz. Methodumuz Prototype içerisinde tek bir tane olarak bulunur ve kullanırız.
Ancak su yanlış anlaşılmamalıdır. Yandaki Person ‘dan da 2 nesne yaratacak olursak Employee’nin baktığı prototype’a bakmaz. Onun için ayrı bir prototype oluşturulur. Yani tamamen javascript’in static bir alanına gömüyoruz gibi anlaşılmamalıdır. Person için ayrı employee için ayrı bir prototype yaratılır.
Yukarıdaki örnekte Employee , Person nesnesinden türemektedir. Employee ve Person ise object den türemektedir. Eğer emp1 ve emp2 nesnelerini oluşturup , emp1 ‘den Employee prototype’larına function eklersek. Emp1’den oluşturduğumuz function’a emp2 den erişebiliriz.
Get Ömer Çelik’s stories in your inbox
Join Medium for free to get updates from this writer.
Person1 veya person2’den Person.prototype’ına bir method eklersek, bu methoda emp1 ve emp2’den erişebiliriz. Veyahut object prototype’ına bir method eklersek emp ve person nesnelerinden bu methoda erişebiliriz.
Yani bir A sınıfımızdan oluşturduğumuz tüm nesneler için prototype bir tanedir. Bir B sınıftan oluşturduğumuz tüm nesneler için de prototype bir tanedir. Yani A için bir prototype B için de ayrı bir prototype oluşturulur.
Prototype’lar sayesinde objeler arası kalıtım yapabiliyoruz. Bir objenin prototype’ı ilk önce kendi prototype’ini gösterir.
Object.Create
Bir obje oluştururken prototype’ini başka bir objeden almamızı sağlar.
Aslında burada obj nesnesinin kendi prototype’ı bulunmakta. Emp nesnemizin prototype özelliği ise obj nesnesine işaret ediyor. Burada test1 ve test2 function’ları prototype’ın içerisine gömülmemiş olmasına ragmen emp artık onu içerir . Çünkü emp’nin prototype’ı direk obj nesnesine işaret eder.
Eğer sadece prototype’ına işaret etmek isteseydık
const emp = Object.create(obj.prototype) derdik.







