JavaScript’te Prototipler ve Miras Alma (Inheritance with Prototypes in JavaScript)
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.