JavaScript'te Kalıtım ve Polimorfizm Nedir?

JavaScript'te Kalıtım ve Polimorfizm Nedir?

Bu makalede, JavaScript'te kalıtım ve polimorfizm kavramlarını anlatıyoruz Kalıtım, nesne yönelimli programlamada sıklıkla kullanılan bir özelliktir Polimorfizm ise nesnelerin aynı adı taşıyan ancak farklı davranışlar gösteren yöntemlere sahip olmasını sağlar Detaylı bilgi için okumaya devam edin!

JavaScript'te Kalıtım ve Polimorfizm Nedir?

JavaScript, günümüzde en popüler dillerden biridir ve web uygulamaları için kullanılan önemli bir programlama dilidir. Kalıtım ve polimorfizm gibi nesne yönelimli programlama konuları, kodunuzun daha temiz ve yeniden kullanılabilir olmasını sağlar ve geliştirme sürecini hızlandırır. Bu makalede, JavaScript'te kalıtım ve polimorfizmin tanımı ve nasıl kullanılabileceği incelenecektir.


Kalıtım Nedir?

Kalıtım, JavaScript'te bir nesnenin özelliklerini ve davranışlarını başka bir nesneye aktarmanın bir yoludur. Bu, bir nesneden türetilen yeni bir nesne oluşturmak için kullanılır. Özellikle büyük projelerde, aynı özelliklere sahip birçok nesne oluşturmak yerine, bir ana nesne oluşturup diğer nesnelere kalıtım yapmak kodun daha az yazılmasına ve daha düzenli hale gelmesine yardımcı olur.

Kalıtım, JavaScript'te prototipler aracılığıyla gerçekleştirilir. Bir nesnenin birçok özelliği ve davranışı prototipten miras alır. Miras alınan prototiplerin zincirleme olarak birleşmesiyle bir prototip zinciri oluşur. Bu zincirde ilerleyerek nesnelerin sahip olduğu özellikleri ve davranışları belirleyebilirsiniz.


Polimorfizm Nedir?

Polimorfizm, bir nesnenin birden fazla şekilde davranabilmesidir. Bu, JavaScript gibi birçok programlama dilinde kullanılan önemli bir kavramdır. JavaScript'te polimorfizm, bir işlevin farklı parametrelerle farklı şekillerde davranabilmesi anlamına gelir. Yani aynı isme sahip farklı işlevler, farklı parametrelerle farklı işlemler yapabilirler.

Örneğin, bir matematik işlevi alalım. Toplama işlevi, farklı sayılarla çağrılabilir ve her bir çağrı farklı bir sonuç üretebilir. Bu polimorfizmin bir örneğidir. Ayrıca, aynı ismi taşıyan ancak farklı özelliklere sahip nesneler de polimorfizme örnektir.

JavaScript'te fonksiyonların polimorfik davranışı, parametrelerin sayısı ve türüne bağlıdır. ES6 ile birlikte, rest parameters kullanılarak farklı sayıda parametreler alabilen işlevler oluşturulabilir. Dinamik yöntem çağrısı ise bir nesnenin yöntemi runtime'da değiştirilebilir hale getirir ve bu da polimorfizmin bir örneğidir. Prototip tabanlı kalıtımın bir sonucu olarak, bir nesnenin özelliklerini ve davranışlarını başka bir nesne üzerinde değiştirebilirsiniz. Bu, polimorfizm ile sonuçlanır.


Prototip Tabanlı Kalıtım

JavaScript'te kalıtım, prototiplerle gerçekleştirilir. Prototipler, bir nesne örneğine ait özellikleri ve davranışları diğer nesne örneklerine aktarmak için kullanılır. Bu, kodun yeniden kullanılabilirliğini artırır ve aynı özellikleri ve davranışları birçok nesne örneği için yeniden yazmak zorunda kalmadan kodunuzda tekrar kullanabilmenizi sağlar.

Her nesnenin bir prototipi vardır ve nesnelerdeki özellikler ve davranışlar prototiplerinden miras alınır. Bu miras zincirine prototip zinciri denir. Böylece bir nesne örneğindeki değişiklikler, prototip zincirinde yer alan diğer nesne örneklerinde de etkili olur.

Object.create() yöntemi kullanılarak yeni bir nesne prototipi oluşturulabilir. Bu yöntem, bir nesne örneğinden bir prototip oluşturur ve bu prototip diğer nesne örneklerine aktarılabilir. Ayrıca, JavaScript'te Constructors kullanarak da kalıtım işlemi gerçekleştirilebilir.

Prototip tabanlı kalıtımın bir sonucu olarak, bir nesnenin özelliklerini ve davranışlarını başka bir nesne üzerinde değiştirebilirsiniz. Böylece bir işlevdeki bir özelliği veya davranışı tüm nesne örneklerinde etkili hale getirebilirsiniz.

JavaScript'te prototip tabanlı kalıtım sayesinde kodunuzu daha az tekrarlamayla daha etkili bir şekilde yazabilirsiniz. Prototip zinciri, nesnelerin birbirinden miras alarak daha az kod yazılmasına yardımcı olur ve kodun daha kolay anlaşılmasını ve bakımını sağlar.


Prototip Zinciri

JavaScript'te kalıtım, prototiplerle gerçekleştirilir ve her nesnenin bir prototipi vardır. Bu prototipler, nesnelere özellik ve davranışlarını aktaran yapı taşlarıdır. Nesnelerdeki özellikler ve davranışlar prototiplerinden miras alınır. Bu miras zincirine ise prototip zinciri denir.

Bir nesnenin prototipi, veri yapısı olarak başka bir nesne olabilir. Bu durumda, özellikler ve davranışlar, nesneler arasındaki bağlantılar aracılığıyla miras alınır. Bu yapı sayesinde, kodda tekrarlayan özellik ve davranışları yazmak yerine, bunları bir kez tanımlayarak birden çok nesne üzerinde kullanabilirsiniz.

Prototip zinciri, nesnelerin özelliklerinin ve davranışlarının nasıl aktarıldığını gösterir. Bu zincir, her nesnenin bir üst prototipe bağlı olduğu bir hiyerarşik yapıdır. Her nesne, prototip zincirindeki üst öğelerin özelliklerini ve davranışlarını miras alır. Bu sayede, kodun yeniden kullanılabilirliği artar ve daha az kod yazarak işler daha hızlı halledilebilir.


Object.create()

JavaScript'te kalıtımın bir şekli olarak, Object.create() yöntemi kullanılarak yeni bir nesne prototipi oluşturabilirsiniz. Bu yöntemde, mevcut bir nesnenin prototipi yeni bir nesne için prototip olarak kullanılır.

Aşağıdaki örnekte, bir "Animal" nesnesinin prototipi kullanılarak "Cat" nesnesinin oluşturulması gösterilmiştir:

let Animal = {   eat: function() {      console.log("Animal eats");   }};

let Cat = Object.create(Animal);Cat.purr = function() { console.log("Cat purrs");};

Yukarıdaki örnekte, "Animal" nesnesinin "eat" özelliği ve davranışı "Cat" nesnesine aktarılmıştır. "Cat" nesnesine ek olarak, "purr" özelliği ve davranışı da eklenmiştir.

Object.create() yöntemi, prototip tabanlı kalıtım için kullanılan en yaygın yöntemlerden biridir ve özellikle birden çok nesne için aynı prototipi kullanmak istediğinizde faydalıdır.


Constructors kullanarak Kalıtım

JavaScript'te Constructors, kalıtım işlemi için kullanılan bir başka yöntemdir. Constructor, bir nesnenin özelliklerinin tanımlandığı bir işlevdir. Bu işlev, new anahtar kelimesiyle çağrılır ve yeni bir nesne oluşturur. Constructor'lar, yeni bir nesne oluşturmak için kullanılan sınıfların JavaScript versiyonudur.

Constructor kullanarak kalıtım yapmak için, bir nesnenin tanımlandığı bir Constructor işlevi oluşturulur. Sonra, kalıtım yapmak istediğiniz nesnenin prototipi bu Constructor'a atanır. Bu, Child Constructor'ın Parent Constructor'dan özellikleri miras almasını sağlar. Aşağıdaki örnekte, Person Constructor'ı oluşturup Employee Constructor'ı bu Constructor'a atanmıştır.

function Person(name, age) {  this.name = name;  this.age = age;}

function Employee(name, age, job) { Person.call(this, name, age); this.job = job;}Employee.prototype = Object.create(Person.prototype);Employee.constructor = Employee;

Burada, Person Constructor'ı name ve age özelliklerini belirlerken, Employee Constructor'ı Person Constructor'ından özellikleri miras almak için Person.call() yöntemini kullanmıştır. Ayrıca, Employee Constructor'ı Parent Constructor'ın (Person Constructor) prototipini kullanmak üzere Object.create() yöntemi kullanmıştır. Employee Constructor'ın prototipi, Person Constructor'ın prototipi olarak ayarlanır ve Employee Constructor'ın constructor'ı Employee olarak ayarlanır.

Şimdi, Employee Constructor'ı kullanarak yeni bir nesne oluşturulabilir ve Parent Constructor (Person Constructor) ile işlevselliği paylaşabilir. Yeni bir nesne oluşturmak için, Employee Constructor'ına new anahtar kelimesi ile çağrı yapılır.

let employee1 = new Employee("John Doe", 32, "Developer");console.log(employee1.name); // John Doeconsole.log(employee1.age); // 32console.log(employee1.job); // Developer

Burada, employee1 nesnesi Employee Constructor'ı ile oluşturulur ve Person Constructor'ından özellikleri miras alır. Bu özellikler name ve age özellikleridir. Yani, employee1 nesnesinin name özelliği "John Doe" ve age özelliği 32'dir. Ayrıca, employee1 nesnesinde job özelliği de "Developer"dır.

Constructor kullanarak kalıtım yapmanın bir avantajı, iki nesne arasında özellikleri ve davranışları paylaşmanın yollarından biri olmasıdır. Bu tür kalıtım, kodunuzun yeniden kullanılabilirliğini artırabilir ve daha az kod yazarak işleri halletmenizi sağlayabilir.


Polimorfizm ve Fonksiyonlar

JavaScript'te fonksiyonlar polimorfik davranış gösterebilirler. Bu, fonksiyonların aldığı parametrelerin sayısı ve türüne bağlıdır. Fonksiyonlar farklı parametrelerle farklı şekillerde davranabilirler. Örneğin, bir toplama işlevi, iki sayı parametresi aldığında toplama işlemini gerçekleştirirken, üç sayı parametresi aldığında, ilk iki sayıyı toplar ve üçüncü sayıyı ekler.

Fonksiyonlarda polimorfizm, işlevin içinde kontrol edilir. Eğer fonksiyon, belirli bir parametre türünü bekliyorsa ve o türden bir parametre gönderilirse, işlev normal şekilde çalışır. Ancak, beklenen parametre türü yerine farklı bir parametre türü gönderilirse, işlev farklı bir şekilde davranabilir veya hata verebilir.

ES6 ile birlikte, rest parameters kullanılarak farklı sayıda parametreler alabilen işlevler oluşturulabilir. Bu, polimorfizm için daha fazla olanak sağlar. Ayrıca, JavaScript'te bir nesnenin yöntemi run-time'da değiştirilebilir. Bu, dinamik yöntem çağrısı olarak adlandırılır ve fonksiyonların polimorfik davranışını daha da arttırır.

Sonuç olarak, JavaScript'te fonksiyonların polimorfik davranışı, parametrelerin sayısı ve türüne bağlıdır. Bu, işlevleri farklı şekillerde davranabilen güçlü bir araç haline getirir. Temel JavaScript fonksiyonları, polimorfik davranış sergilemelerine olanak sağlayarak, kodun daha kolay okunmasını, anlaşılmasını ve yeniden kullanılmasını sağlar.


Rest Parameters

ES6 ile birlikte, rest parameters konsepti tanıtılmıştır. Bu, işlevlerin değişken sayıda parametre almasına olanak tanır. Diğer bir deyişle, rest parameters kullanarak işlevler farklı parametre sayılarına sahip olabilir.

Rest parameters önemli bir avantaj sağlar. Böylece, işlevi farklı sayıda parametrelerle kullanabilirsiniz. Örneğin, bir dizi parametre alabilecek bir işlev oluştururken, rest parameters kullanarak bu dizi parametrelerin sayısını değişken hale getirebilirsiniz.

Rest parameters kullanarak yeni işlevlerin oluşturulması kolaydır. Bu, kodun kolay anlaşılırlığını ve okunabilirliğini artırır. Bunun yanında, rest parameters kullanımı, kodun daha az yazılmasını sağlar ve böylece, daha az hata yapma şansınız olur.

Örnek Kullanım Açıklama
function toplama(...sayilar) Rest parameters kullanarak, işlevin değişken sayıda parametre kabul etmesi sağlanmıştır.
toplama(1, 2, 3) İşlev, 1, 2 ve 3 parametreleriyle çağrılabilir.
toplama(1, 2, 3, 4) İşlev, 1, 2, 3 ve 4 parametreleriyle çağrılabilir.

Rest parameters kullanımı, programlama dünyasında giderek yaygınlaşan bir teknik haline gelmektedir. Bu nedenle, JavaScript'te rest parameters'ın yerini ve önemini anlamak önemlidir. Rest parameters kullanarak, programınız daha etkili, okunaklı ve yeniden kullanılabilir hale gelecektir.


Dinamik Yöntem Çağrısı

JavaScript'te, bir nesnenin yöntemi run-time'da değiştirilebilir ve bu özellik dinamik yöntem çağrısı olarak adlandırılır. Bu, fonksiyonları farklı şekillerde çağırmanıza olanak tanır ve uygulamanın ihtiyaçlarına uygun olarak fonksiyon davranışları değiştirilebilir.

Bu özellik, JavaScript kodunda güçlü bir esneklik sağlar ve nesnelerde daha dinamik ve çok yönlü bir davranış elde etmenizi sağlar. Ayrıca, dinamik yöntem çağrısı kullanılarak, kodunuz daha modüler hale getirilebilir ve tekrar kullanılabilirliği artırabilirsiniz.


Üzerine Yazma ve Polimorfizm

JavaScript'te kalıtım ve polimorfizm, kod yazarken size çok yardımcı olabilecek güçlü araçlardır. Kalıtım, bir nesnenin özelliklerini ve davranışlarını diğer nesnelere aktarmanın bir yoludur. Polimorfizm ise, bir nesnenin birden fazla şekilde davranabilmesidir. JavaScript'te kalıtım, Prototip tabanlı kalıtım ile gerçekleştirilir. Prototip tabanlı kalıtım, bir nesne örneğinden diğer nesne örneklerine özelliklerin ve davranışların aktarılması yoluyla yapılır.

Prototip tabanlı kalıtımın bir sonucu olarak, bir nesnenin özelliklerini ve davranışlarını başka bir nesne üzerinde değiştirebilirsiniz. Bu, polimorfizm ile sonuçlanır. Bu, bir nesnenin birden fazla şekilde davranabilmesi anlamına gelir. Bu özellik, JavaScript'teki fonksiyonlar ile kullanılarak, farklı parametrelerle bir işlevin farklı şekillerde davranabilmesine yardımcı olur.

Örneğin, bir hayvan nesnesi oluşturalım ve ses çıkaran bir metod yazalım. Ardından, bir köpek nesnesi oluşturalım ve bu nesne üzerinde özellikleri ve davranışları değiştirelim. Bu sayede, köpek nesnesindeki ses çıkaran metod, farklı bir şekilde davranacaktır. Bu, prototip zinciri sayesinde gerçekleştirilir ve polimorfizm ile sonuçlanır.


Sonuç

JavaScript'te kalıtım ve polimorfizm, işlerinizi kolaylaştıracak güçlü özelliklerdir. Kalıtım sayesinde bir nesnenin özelliklerini ve davranışlarını başka bir nesneye aktarabilirsiniz, bu da kodun yeniden kullanılabilirliğini artırır ve fazla zaman kaybetmeden işlerinizi halledersiniz.

Polimorfizm ise bir nesnenin birden fazla şekilde davranabilmesine izin verir. Bir fonksiyonun farklı parametrelerle farklı şekillerde davranması da polimorfizm özelliğini kullanır. Özellikle ES6 ile birlikte getirilen rest parameters özelliği ile daha fazla parametre alabilen fonksiyonlar yazılabilir.

Prototip tabanlı kalıtım sayesinde her nesne örneği bir prototipe sahip olur ve ilk oluşturulan nesnenin özellikleri diğer nesne örneklerine aktarılabilir. Ayrıca, Object.create() yöntemi kullanılarak yeni bir nesne prototipi oluşturmak da mümkündür. Constructors kullanarak kalıtım işlemi yapmak da bir seçenektir.

JavaScript'te dinamik yöntem çağrısı olarak adlandırılan bir özellik sayesinde bir nesnenin yöntemi run-time'da değiştirilebilir. Bu, daha da dinamik bir yazılım geliştirme sürecine olanak tanır.

Prototip tabanlı kalıtımın bir sonucu olarak, bir nesnenin özellikleri ve davranışları başka bir nesne üzerinde değiştirilebilir ve bu da polimorfizm özelliğine yol açar. Bu özellikleri kullanarak daha az kod yazabilir ve işlerinizi daha hızlı halledebilirsiniz.