JavaScript’te Prototipler ve Miras Alma (Inheritance with Prototypes in JavaScript)

Hamdi Yılmaz
3 min readMar 19, 2023

JavaScript’te prototype, nesne tabanlı programlama modelindeki en önemli kavramlardan biridir. prototype kavramı, JavaScript nesneleri arasındaki miras ilişkisini sağlar ve nesnelerin özelliklerini ve yöntemlerini paylaşmalarını sağlar.

Bir JavaScript nesnesi oluşturulduğunda, her nesne bir prototype özelliğine sahip olur. Bu özellik, nesnenin özelliklerini ve yöntemlerini tanımlayan bir nesnedir. JavaScript'te, her nesne Object sınıfının bir örneğidir ve bu nedenle her nesne, Object.prototype özelliğine sahiptir.

JavaScript’te prototype özelliği, bir nesne örneği yaratmak için kullanılan sınıfın özelliklerini ve yöntemlerini tanımlar. Yeni bir nesne örneği yaratıldığında, bu nesnenin prototype özelliği, sınıfın prototype özelliğine eşitlenir. Bu sayede, nesne, sınıfın özelliklerine ve yöntemlerine erişebilir.

prototype özelliği, nesneler arasında miras alma ilişkisini sağlar. Bir nesne, başka bir nesne örneğinin prototype özelliğine erişebilir ve bu sayede diğer nesnenin özelliklerine ve yöntemlerine erişebilir. Bu, nesneler arasında bir hiyerarşi oluşmasını sağlar.

Aşağıda, prototype kavramını daha detaylı bir şekilde anlamak için örnekler verilmiştir.

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

Person.prototype.sayHello = function() {
console.log("Merhaba, ben " + this.name);
};

var person1 = new Person("John");
var person2 = new Person("Mary");

person1.sayHello(); // "Merhaba, ben John"
person2.sayHello(); // "Merhaba, ben Mary"

Yukarıdaki örnekte, Person adında bir sınıf tanımlanmıştır ve bu sınıfın prototype özelliği sayHello() yöntemini içerir. Bu yöntem, Person sınıfının özelliklerine ve yöntemlerine erişebilen herhangi bir nesne tarafından çağrılabilir.

Person sınıfının örneği person1 ve person2 oluşturulur ve her iki örneğe de sayHello() yöntemi atanır. Bu yöntem, prototype nesnesinde tanımlanmıştır ve this anahtar kelimesi, örnek nesneyi temsil eder. Bu sayede, sayHello() yöntemi, örneklere ait name özelliğine erişebilir ve `Merhaba, ben John/Mary` gibi bir çıktı üretir.

Miras alma ve prototype zinciri

function Animal() {
this.isAlive = true;
}

Animal.prototype.die = function() {
this.isAlive = false;
};

function Dog(name, breed) {
Animal.call(this);
this.name = name;
this.breed = breed;
}

Dog.prototype = Object.create(Animal.prototype);
Dog.prototype.constructor = Dog;

Dog.prototype.bark = function() {
console.log("Hav hav!");
};

var dog1 = new Dog("Buddy", "Golden Retriever");
dog1.bark(); // "Hav hav!"
dog1.die();
console.log(dog1.isAlive); // false

Yukarıdaki örnekte, Animal adında bir sınıf tanımlanmıştır ve bu sınıfın prototype özelliği die() yöntemini içerir. Dog adında başka bir sınıf tanımlanmıştır ve bu sınıfın prototype özelliği bark() yöntemini içerir. Dog sınıfı, Animal sınıfından miras alır ve Dog sınıfının özellikleri, Animal sınıfının özelliklerine de sahip olur.

Dog sınıfının örneği dog1 oluşturulur ve bu örneğin bark() yöntemi çağrılır. Bu yöntem, Dog sınıfının prototype özelliğinde tanımlanmıştır. Dog sınıfı ayrıca, Animal sınıfından miras aldığı isAlive özelliğine de sahiptir.

Dog sınıfının prototype özelliği, Object.create() yöntemiyle Animal.prototype özelliğine eşitlenir. Bu sayede, Dog sınıfı, Animal sınıfının özelliklerine erişebilir. Dog sınıfının örneği oluşturulurken, Animal.call(this) yöntemi çağrılır ve bu sayede Dog sınıfının özellikleri, Animal sınıfının özellikleriyle birleştirilir.

dog1 örneği üzerinde bark() yöntemi çağrıldıktan sonra, die() yöntemi çağrılır ve isAlive özelliği false değerine eşitlenir. Bu özellik, Animal sınıfının özelliklerinden miras alınmıştır.

Bu örnekte, prototype zinciri kullanılarak nesneler arasında bir miras ilişkisi oluşturulmuştur. Dog sınıfı, Animal sınıfından miras almıştır ve bu sayede Animal sınıfının özellikleri, Dog sınıfının özellikleriyle birleştirilerek kullanılabilmektedir.

--

--