Tüm blog yazıları

JavaScript Prototype Nedir?

JavaScript'te array ve string gibi nesnelerin metotları nereden gelir? Her nesnede metotlar kopyalanır mı? Hayır! İşte burada prototype devreye giriyor. Prototype nedir, neden önemlidir ve nasıl çalışır, bu kapsamlı rehberde keşfedin.

eminbasbayan6 dk okuma
JavaScript prototype kavramını gösteren bir şema, kod parçacıkları ve nesneler arası miras ilişkisi.

JavaScript'te her array'de .push(), .pop(), .map() gibi onlarca metot var. Her string'de .toUpperCase(), .split(), .includes() var. Peki bu metotlar nereden geliyor? Her array veya string oluşturduğumuzda bu metotların kopyası mı oluşuyor?

Hayır! İşte burada prototype kavramı devreye giriyor. Prototype, JavaScript'in en önemli ve aynı zamanda en kafa karıştırıcı konularından biri. Ama merak etmeyin, aslında fikir oldukça basit.

Prototype Nedir?

Prototype, JavaScript nesnelerinin özellik ve metotları miras aldığı şablon nesnedir. Bir nevi "blueprint" veya "kalıp" gibi düşünebilirsiniz.

Temel Fikir

metin
┌─────────────────────────────────────────────────────────┐
│                   Array.prototype                        │
│  ─────────────────────────────────────────────────────  │
│  push(), pop(), map(), filter(), reduce(), includes()   │
│  concat(), slice(), splice(), forEach(), find()...      │
└─────────────────────────────────────────────────────────┘
                          ▲
           ┌──────────────┼──────────────┐
           │              │              │
      [1, 2, 3]      ["a", "b"]     [true, false]

      Her array, Array.prototype'a referans verir.
      Kendi kopyaları yok, hepsi aynı şablonu kullanır.

Neden Prototype?

Diyelim ki JavaScript'te prototype olmasaydı. Her array oluşturduğunuzda:

javascript
const liste1 = [1, 2, 3];
const liste2 = [4, 5, 6];
const liste3 = [7, 8, 9];

Her birinde push, pop, map, filter gibi 70+ metodun kopyası olurdu. Bu da:

  • Hafızayı gereksiz yere doldururdu
  • Performansı düşürürdü
  • Kod tekrarına yol açardı

Prototype sayesinde tüm array'ler aynı şablonu paylaşır. Metotlar tek bir yerde (prototype'ta) tanımlıdır.

Prototype'ı Görmek

Bir array oluşturup tarayıcı konsolunda inceleyelim:

javascript
const sayilar = [10, 20, 30];
console.log(sayilar);

Konsolu açın ve array'i genişletin. Şöyle bir şey göreceksiniz:

metin
▼ (3) [10, 20, 30]
    0: 10
    1: 20
    2: 30
    length: 3
  ▶ [[Prototype]]: Array(0)

İşte o [[Prototype]] (veya eski tarayıcılarda __proto__) kısmı, bu array'in baktığı şablon nesneyi gösterir.

Prototype İçeriği

[[Prototype]]'ı açarsanız tüm array metotlarını görürsünüz:

metin
▶ [[Prototype]]: Array(0)
    ▶ at: ƒ at()
    ▶ concat: ƒ concat()
    ▶ every: ƒ every()
    ▶ fill: ƒ fill()
    ▶ filter: ƒ filter()
    ▶ find: ƒ find()
    ▶ forEach: ƒ forEach()
    ▶ includes: ƒ includes()
    ▶ map: ƒ map()
    ▶ pop: ƒ pop()
    ▶ push: ƒ push()
    ... ve daha fazlası

Farklı Türlerin Prototype'ları

Her JavaScript türünün kendi prototype'ı vardır:

TürPrototypeBazı Metotları
ArrayArray.prototypepush, pop, map, filter, reduce
StringString.prototypetoUpperCase, split, includes, trim
NumberNumber.prototypetoFixed, toString, toPrecision
ObjectObject.prototypehasOwnProperty, toString, valueOf
FunctionFunction.prototypecall, apply, bind

String Prototype Örneği

javascript
const mesaj = "merhaba dünya";

// Bu metotlar String.prototype'tan geliyor
console.log(mesaj.toUpperCase());  // "MERHABA DÜNYA"
console.log(mesaj.split(" "));     // ["merhaba", "dünya"]
console.log(mesaj.includes("dünya")); // true

Number Prototype Örneği

javascript
const fiyat = 99.456;

// Bu metotlar Number.prototype'tan geliyor
console.log(fiyat.toFixed(2));     // "99.46"
console.log(fiyat.toString());     // "99.456"

Prototype'a Erişim

Prototype nesnesine birkaç yolla erişebilirsiniz:

1. Constructor Üzerinden

javascript
// Array'lerin şablonu
console.log(Array.prototype);

// String'lerin şablonu
console.log(String.prototype);

// Object'lerin şablonu
console.log(Object.prototype);

2. Nesne Üzerinden (proto)

javascript
const meyveler = ["elma", "armut"];

// Bu array'in baktığı prototype
console.log(meyveler.__proto__);

// Array.prototype ile aynı mı?
console.log(meyveler.__proto__ === Array.prototype);  // true

3. Object.getPrototypeOf()

javascript
const isim = "Ahmet";

// Modern yöntem
console.log(Object.getPrototypeOf(isim));

proto vs prototype

Bu iki terim sık karıştırılır. Farkı anlayalım:

TerimNe?Nerede?
prototypeŞablon nesnenin kendisiConstructor fonksiyonlarda (Array, String, vb.)
__proto__Şablona referansHer nesnede (array, string, object, vb.)
javascript
// prototype: Şablonun kendisi
console.log(Array.prototype);  // Tüm array metotları burada

// __proto__: Şablona referans
const arr = [1, 2];
console.log(arr.__proto__);    // Array.prototype'a işaret eder

// İkisi aynı nesneyi gösterir
console.log(arr.__proto__ === Array.prototype);  // true

Görsel Temsil

metin
Array.prototype (şablon nesne)
       ▲
       │ referans (__proto__)
       │
    [1, 2, 3] (array örneği)

Prototype Zincirleme

Prototype'lar zincir halinde birbirine bağlıdır. Buna prototype chain denir.

javascript
const dizi = [1, 2, 3];

// dizi'nin prototype'ı → Array.prototype
// Array.prototype'ın prototype'ı → Object.prototype
// Object.prototype'ın prototype'ı → null (zincir sonu)
metin
         [1, 2, 3]
              │
              ▼
       Array.prototype    (push, pop, map...)
              │
              ▼
       Object.prototype   (toString, hasOwnProperty...)
              │
              ▼
            null          (zincir sonu)

Pratik Örnek

javascript
const liste = ["a", "b", "c"];

// Array metodunu kullan
liste.push("d");           // Array.prototype'tan

// Object metodunu kullan
liste.hasOwnProperty(0);   // Object.prototype'tan → true

// toString - hem Array hem Object'te var
// Array'inki önce bulunur (daha yakın)
liste.toString();          // "a,b,c"

Prototype'a Metot Ekleme

Prototype'a kendi metotlarımızı ekleyebiliriz. Dikkat: Bu genellikle önerilmez ama nasıl çalıştığını anlamak önemli.

String'e Metot Ekleme

javascript
// Tüm string'lere "bagir" metodu ekleyelim
String.prototype.bagir = function() {
    return this.toUpperCase() + "!!!";
};

// Artık her string bu metodu kullanabilir
const selam = "merhaba";
console.log(selam.bagir());  // "MERHABA!!!"

const isim = "ahmet";
console.log(isim.bagir());   // "AHMET!!!"

Array'e Metot Ekleme

javascript
// Tüm array'lere "ilkVeSon" metodu ekleyelim
Array.prototype.ilkVeSon = function() {
    return {
        ilk: this[0],
        son: this[this.length - 1]
    };
};

// Kullanım
const harfler = ["a", "b", "c", "d", "e"];
console.log(harfler.ilkVeSon());  // {ilk: "a", son: "e"}

const numaralar = [10, 20, 30];
console.log(numaralar.ilkVeSon()); // {ilk: 10, son: 30}

Neden Önerilmez?

javascript
// Mevcut metotları ezmek tehlikeli!
Array.prototype.push = function() {
    return "Bu array'e ekleme yapılamaz!";
};

const test = [1, 2, 3];
test.push(4);  // 4 eklenmez, mesaj döner!
// Tüm array'ler artık bozuk!

Sorunlar:

  1. Başka kütüphanelerle çakışabilir
  2. Gelecekteki JavaScript güncellemeleriyle çakışabilir
  3. Kodun okunabilirliğini azaltır
  4. Debug etmeyi zorlaştırır

Metot Arama Sırası

JavaScript bir metot çağırdığınızda şu sırayla arar:

javascript
const kelimeler = ["elma", "armut"];

// kelimeler.push(4) çağrıldığında:
// 1. kelimeler nesnesinin kendisinde "push" var mı? → Hayır
// 2. kelimeler.__proto__ (Array.prototype)'da var mı? → Evet! Bulduk.

// kelimeler.toString() çağrıldığında:
// 1. kelimeler nesnesinin kendisinde "toString" var mı? → Hayır
// 2. Array.prototype'da var mı? → Evet! (Array'in kendi toString'i)

// kelimeler.hasOwnProperty(0) çağrıldığında:
// 1. kelimeler'de var mı? → Hayır
// 2. Array.prototype'da var mı? → Hayır
// 3. Object.prototype'da var mı? → Evet! Bulduk.

Pratik Örnek: Kendi Nesnemiz

javascript
// Basit bir nesne oluşturalım
const araba = {
    marka: "Toyota",
    model: "Corolla",
    bilgiVer: function() {
        return `${this.marka} ${this.model}`;
    }
};

console.log(araba.bilgiVer());      // "Toyota Corolla"
console.log(araba.toString());       // "[object Object]" - Object.prototype'tan
console.log(araba.hasOwnProperty("marka")); // true - Object.prototype'tan

Prototype Kontrolü

javascript
// araba'nın prototype'ı nedir?
console.log(araba.__proto__ === Object.prototype);  // true

// Object.prototype'ın prototype'ı nedir?
console.log(Object.prototype.__proto__);  // null (zincir sonu)

Özet

KavramAçıklama
PrototypeNesnelerin metot ve özellikleri miras aldığı şablon nesne
__proto__Her nesnede bulunan, prototype'a referans veren özellik
.prototypeConstructor fonksiyonlarda bulunan, şablonun kendisi
Prototype ChainPrototype'ların birbirine bağlı zinciri
Metot AramaÖnce nesnede, sonra prototype zincirinde aranır

Neden Önemli?

Prototype kavramını anlamak şunlar için kritik:

  1. JavaScript'in temelini anlamak - Tüm OOP bu sistem üzerine kurulu
  2. Constructor Functions - Kendi nesnelerimizi oluştururken prototype kullanacağız
  3. Classes - ES6 class'ları aslında prototype'ın üzerine syntax sugar
  4. Miras (Inheritance) - Nesneler arası miras prototype ile çalışır
  5. Performans - Metotların neden tek yerde tutulduğunu anlamak

Sırada Ne Var?

Prototype'ın ne olduğunu öğrendik. Peki kendi nesnelerimizi nasıl oluştururuz? Onlarca benzer nesne üretmek istesek ne yaparız?

Bir sonraki makalede Object-Oriented Programming (OOP) kavramına giriş yapacağız ve JavaScript'te nesne yönelimli programlamanın temellerini öğreneceğiz.

JavaScript Classes ile pratik uygulamalar, metotlar arası iletişim ve gerçek dünya kod örnekleri
JavaScript Dersleri9 dk okuma

JavaScript Classes - Pratik Uygulamalar

JavaScript class'ları ile pratik uygulamalara geçin! Metotlar arası iletişimden constructor'da metot çağırmaya, kod tekrarını azaltmaktan gerçek dünya senaryolarına kadar class kullanımının inceliklerini keşfedin. Kendi alışveriş sepeti örneğinizle bilginizi pekiştirin.

Yazıyı oku
JavaScript class yapısını gösteren bir kod örneği, ES6 ile modern nesne oluşturma
JavaScript Dersleri9 dk okuma

JavaScript Classes

ES6 ile JavaScript'e gelen class yapısı sayesinde nesne oluşturmak artık çok daha kolay ve düzenli! Constructor function karmaşasından kurtulup, okunabilir ve yönetilebilir kodlar yazmak isteyenler için modern JavaScript'in temel taşı olan class'ları tüm detaylarıyla keşfedin. Bu rehberle nesne şabl

Yazıyı oku
JavaScript kodunda Constructor Function ve new keyword'ü ile nesne oluşturma örnekleri
JavaScript Dersleri8 dk okuma

Constructor Functions ve new Keyword

Factory Function'ların hafıza israfı sorununa Constructor Function'lar ve new keyword'ü ile son verin! Metotları paylaştırarak JavaScript objelerini daha verimli nasıl oluşturacağınızı, new'in perde arkasında neler yaptığını ve prototype sisteminin gücünü bu rehberde keşfedin.

Yazıyı oku

Çerez tercihlerin

Platformun çalışması için zorunlu çerezler kullanıyoruz. İzin verirsen anonim kullanım verilerini ölçüyoruz. Ayrıntıları incele