<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="https://sonsuzus.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://sonsuzus.github.io/" rel="alternate" type="text/html" /><updated>2026-07-28T17:13:29+00:00</updated><id>https://sonsuzus.github.io/feed.xml</id><title type="html">SonsuzUs</title><subtitle>Programlama ve Yazılım</subtitle><author><name>Sonsuz Us</name></author><entry><title type="html">Asenkron Programlama ve Callback Mantığını Anlamak</title><link href="https://sonsuzus.github.io/posts/asenkron-programlama-ve-callback-mantigini-anlamak/" rel="alternate" type="text/html" title="Asenkron Programlama ve Callback Mantığını Anlamak" /><published>2026-07-28T00:00:00+00:00</published><updated>2026-07-28T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/asenkron-programlama-ve-callback-mantigini-anlamak</id><content type="html" xml:base="https://sonsuzus.github.io/posts/asenkron-programlama-ve-callback-mantigini-anlamak/"><![CDATA[<p>Bir web sayfası veri indirirken düğmeler çalışmıyor, animasyonlar takılıyor ve kullanıcı boş boş ekrana bakıyorsa tarayıcı muhtemelen uzun bir işlem tarafından meşgul edilmiştir. Asenkron programlama; ağ isteği, zamanlayıcı veya dosya okuma gibi sonucu hemen hazır olmayan işleri beklerken ana akışın çalışmaya devam etmesini sağlar. Callback, yani geri çağırım fonksiyonu ise işlem tamamlandığında “Bitti, şimdi ne yapayım?” sorusuna verilen cevaptır.
``</p>

<h2 id="senkron-ve-asenkron-çalışma">Senkron ve asenkron çalışma</h2>

<p>JavaScript temel olarak <strong>tek iş parçacıklı</strong> çalışır. Başka bir ifadeyle aynı anda yalnızca bir JavaScript komutu yürütülür. Senkron kodda her işlem, sıradaki işlemin başlamasından önce tamamlanmalıdır. Uzun süren bir görev bu sırayı bloke ederse kullanıcı arayüzü de yanıt veremez.</p>

<p>Asenkron yapıda ise JavaScript, bekleme gerektiren görevi tarayıcının Web API sistemine teslim eder ve diğer komutları yürütür. Görev tamamlandığında ilgili callback kuyruğa eklenir. Buradaki önemli ayrıntı şudur: Callback hemen çalışmaz; <strong>call stack</strong>, yani çağrı yığını boşaldığında çalışabilir.</p>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>Senkron çalışma</th>
      <th>Asenkron çalışma</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>İşlem sırası</td>
      <td>Bir görev bitmeden diğeri başlamaz</td>
      <td>Bekleyen görev sırasında akış sürer</td>
    </tr>
    <tr>
      <td>Arayüz etkisi</td>
      <td>Uzun işlem ekranı dondurabilir</td>
      <td>Bekleme işlemlerinde arayüz kullanılabilir</td>
    </tr>
    <tr>
      <td>Sonuç yönetimi</td>
      <td>Sonuç doğrudan alınır</td>
      <td>Callback, Promise veya <code class="language-plaintext highlighter-rouge">async/await</code> kullanılır</td>
    </tr>
    <tr>
      <td>Uygun örnek</td>
      <td>Basit matematik hesabı</td>
      <td>Veri çekme, zamanlayıcı, kullanıcı olayı</td>
    </tr>
  </tbody>
</table>

<p>Bir işlemin toplam bekleme süresini kabaca şu şekilde düşünebiliriz:</p>

\[T_{toplam} = T_{başlatma} + T_{bekleme} + T_{callback}\]

<p>Asenkronluk $T_{bekleme}$ değerini yok etmez. Yalnızca JavaScript’in bu süre boyunca başka işlerle ilgilenebilmesini sağlar.</p>

<h2 id="callback-nasıl-çalışır">Callback nasıl çalışır?</h2>

<p>Callback, başka bir fonksiyona argüman olarak verilen ve uygun zamanda çağrılan fonksiyondur. En bilinen örneklerden biri <code class="language-plaintext highlighter-rouge">setTimeout</code> kullanımıdır:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">Sipariş alındı</span><span class="dl">"</span><span class="p">);</span>

<span class="nf">setTimeout</span><span class="p">(()</span> <span class="o">=&gt;</span> <span class="p">{</span>
  <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">Sipariş hazır!</span><span class="dl">"</span><span class="p">);</span>
<span class="p">},</span> <span class="mi">2000</span><span class="p">);</span>

<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">Bu sırada başka müşteriye bakılıyor</span><span class="dl">"</span><span class="p">);</span>
</code></pre></div></div>

<p>Çıktıda “Sipariş hazır!” mesajı en son görünür. <code class="language-plaintext highlighter-rouge">setTimeout</code>, callback’i iki saniye sonra doğrudan çalıştırmaz; en az iki saniye geçtikten sonra görev kuyruğuna gönderir. Event loop, çağrı yığını boş olduğunda bu görevi yürütür. Dolayısıyla yoğun bir JavaScript işlemi varsa callback daha geç başlayabilir.</p>

<h2 id="veri-çekme-senaryosu">Veri çekme senaryosu</h2>

<p>Aşağıdaki fonksiyon, veri isteğinin sonucunu bir callback üzerinden dışarı iletir:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">function</span> <span class="nf">kullaniciGetir</span><span class="p">(</span><span class="nx">id</span><span class="p">,</span> <span class="nx">tamamlandi</span><span class="p">)</span> <span class="p">{</span>
  <span class="nf">fetch</span><span class="p">(</span><span class="s2">`https://jsonplaceholder.typicode.com/users/</span><span class="p">${</span><span class="nx">id</span><span class="p">}</span><span class="s2">`</span><span class="p">)</span>
    <span class="p">.</span><span class="nf">then</span><span class="p">(</span><span class="nx">response</span> <span class="o">=&gt;</span> <span class="p">{</span>
      <span class="k">if </span><span class="p">(</span><span class="o">!</span><span class="nx">response</span><span class="p">.</span><span class="nx">ok</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">throw</span> <span class="k">new</span> <span class="nc">Error</span><span class="p">(</span><span class="dl">"</span><span class="s2">Kullanıcı bulunamadı</span><span class="dl">"</span><span class="p">);</span>
      <span class="p">}</span>
      <span class="k">return</span> <span class="nx">response</span><span class="p">.</span><span class="nf">json</span><span class="p">();</span>
    <span class="p">})</span>
    <span class="p">.</span><span class="nf">then</span><span class="p">(</span><span class="nx">data</span> <span class="o">=&gt;</span> <span class="nf">tamamlandi</span><span class="p">(</span><span class="kc">null</span><span class="p">,</span> <span class="nx">data</span><span class="p">))</span>
    <span class="p">.</span><span class="k">catch</span><span class="p">(</span><span class="nx">error</span> <span class="o">=&gt;</span> <span class="nf">tamamlandi</span><span class="p">(</span><span class="nx">error</span><span class="p">,</span> <span class="kc">null</span><span class="p">));</span>
<span class="p">}</span>

<span class="nf">kullaniciGetir</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="nx">hata</span><span class="p">,</span> <span class="nx">kullanici</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="p">{</span>
  <span class="k">if </span><span class="p">(</span><span class="nx">hata</span><span class="p">)</span> <span class="p">{</span>
    <span class="nx">console</span><span class="p">.</span><span class="nf">error</span><span class="p">(</span><span class="nx">hata</span><span class="p">.</span><span class="nx">message</span><span class="p">);</span>
    <span class="k">return</span><span class="p">;</span>
  <span class="p">}</span>

  <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="s2">`Merhaba </span><span class="p">${</span><span class="nx">kullanici</span><span class="p">.</span><span class="nx">name</span><span class="p">}</span><span class="s2">!`</span><span class="p">);</span>
<span class="p">});</span>
</code></pre></div></div>

<p>Burada <code class="language-plaintext highlighter-rouge">tamamlandi</code> fonksiyonu <strong>error-first callback</strong> yaklaşımını kullanır: İlk parametre hata, ikinci parametre başarılı sonuçtur. Ağ isteği sürerken tarayıcı diğer olayları işlemeye devam eder. İstek sonuçlandığında callback uygun kuyruğa alınır.</p>

<h2 id="her-uzun-işlem-asenkron-değildir">Her uzun işlem asenkron değildir</h2>

<p>Ağ istekleri tarayıcı altyapısına devredilebilir; fakat milyonlarca elemanı hesaplayan yoğun bir döngü otomatik olarak arka plana taşınmaz. Böyle bir CPU işlemi ana iş parçacığını yine dondurur. Ağır hesaplamalar için <strong>Web Worker</strong>, görevleri parçalara bölme veya sunucu tarafında işleme gibi çözümler gerekir.</p>

<p>Callback’ler küçük senaryolarda anlaşılırdır; ancak iç içe kullanıldıklarında “callback hell” adı verilen karmaşık bir yapı oluşturabilir. Modern JavaScript’te Promise ve <code class="language-plaintext highlighter-rouge">async/await</code>, aynı asenkron mantığı daha okunabilir biçimde ifade eder. Yine de event loop ve callback temelini anlamak, bu modern yapıların perde arkasında neden ve nasıl çalıştığını kavramanın en sağlam yoludur.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="JavaScript" /><category term="Asenkron Programlama" /><category term="Callback" /><summary type="html"><![CDATA[Bir web sayfası veri indirirken düğmeler çalışmıyor, animasyonlar takılıyor ve kullanıcı boş boş ekrana bakıyorsa tarayıcı muhtemelen uzun bir işlem tarafından meşgul edilmiştir. Asenkron programlama; ağ isteği, zamanlayıcı veya dosya okuma gibi sonucu hemen hazır olmayan işleri beklerken ana akışın çalışmaya devam etmesini sağlar. Callback, yani geri çağırım fonksiyonu ise işlem tamamlandığında “Bitti, şimdi ne yapayım?” sorusuna verilen cevaptır.]]></summary></entry><entry><title type="html">Async/Await ile Modern Asenkron Akışları Yönetmek</title><link href="https://sonsuzus.github.io/posts/asyncawait-ile-modern-asenkron-akislari-yonetmek/" rel="alternate" type="text/html" title="Async/Await ile Modern Asenkron Akışları Yönetmek" /><published>2026-07-28T00:00:00+00:00</published><updated>2026-07-28T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/asyncawait-ile-modern-asenkron-akislari-yonetmek</id><content type="html" xml:base="https://sonsuzus.github.io/posts/asyncawait-ile-modern-asenkron-akislari-yonetmek/"><![CDATA[<p>Bir web servisine istek gönderirken, dosya okurken veya veritabanından kayıt beklerken uygulamanın tamamen durmasını istemeyiz. JavaScript’in <code class="language-plaintext highlighter-rouge">async/await</code> sözdizimi, arka planda asenkron çalışan bu işlemleri sanki adım adım ilerleyen senkron kodlarmış gibi yazmamızı sağlar. Sonuç; daha az iç içe fonksiyon, daha anlaşılır hata yönetimi ve geliştiricinin saç baş yolma ihtimalinde kayda değer bir azalmadır.
``</p>
<h2 id="asenkron-çalışma-neden-gereklidir">Asenkron çalışma neden gereklidir?</h2>

<p>Senkron bir programda her işlem, kendisinden önceki işlemin bitmesini bekler. Uzun süren bir ağ isteği bütün akışı engellerse kullanıcı arayüzü donabilir. Asenkron modelde ise bekleyen görev kenara alınır ve çalışma zamanı diğer işleri yürütmeye devam eder.</p>

<p>Bir işlemin toplam süresini kabaca şu şekilde düşünebiliriz:</p>

\[T_{senkron} = T_1 + T_2 + \cdots + T_n\]

<p>Bağımsız görevler paralel biçimde başlatıldığında ideal süre, görev sürelerinin toplamı yerine en uzun göreve yaklaşır:</p>

\[T_{asenkron} \approx \max(T_1, T_2, \ldots, T_n)\]

<p>Elbette JavaScript’in ana iş parçacığı aynı anda iki JavaScript komutu çalıştırmaz. Ağ, zamanlayıcı ve dosya sistemi gibi işlemler çalışma ortamına devredilir; tamamlanan görevlerin devamı olay döngüsü tarafından uygun zamanda yürütülür.</p>

<table>
  <thead>
    <tr>
      <th>Yaklaşım</th>
      <th style="text-align: right">Okunabilirlik</th>
      <th>Hata yönetimi</th>
      <th>Kullanım alanı</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Callback</td>
      <td style="text-align: right">Düşük veya orta</td>
      <td>İç içe yapıda zor</td>
      <td>Eski API’ler</td>
    </tr>
    <tr>
      <td>Promise zinciri</td>
      <td style="text-align: right">Orta</td>
      <td><code class="language-plaintext highlighter-rouge">.catch()</code> ile</td>
      <td>Fonksiyonel akışlar</td>
    </tr>
    <tr>
      <td>Async/Await</td>
      <td style="text-align: right">Yüksek</td>
      <td><code class="language-plaintext highlighter-rouge">try/catch</code> ile</td>
      <td>Karmaşık iş süreçleri</td>
    </tr>
  </tbody>
</table>

<h2 id="async-ve-await-ne-yapar">Async ve await ne yapar?</h2>

<p><code class="language-plaintext highlighter-rouge">async</code> ile işaretlenen bir fonksiyon her zaman <code class="language-plaintext highlighter-rouge">Promise</code> döndürür. Fonksiyon doğrudan bir değer döndürse bile bu değer çözülmüş bir Promise içine sarılır. <code class="language-plaintext highlighter-rouge">await</code> ise Promise sonuçlanana kadar yalnızca ilgili asenkron fonksiyonun ilerleyişini bekletir; uygulamanın tamamını kilitlemez.</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">async</span> <span class="kd">function</span> <span class="nf">kullaniciGetir</span><span class="p">(</span><span class="nx">id</span><span class="p">)</span> <span class="p">{</span>
  <span class="kd">const</span> <span class="nx">yanit</span> <span class="o">=</span> <span class="k">await</span> <span class="nf">fetch</span><span class="p">(</span><span class="s2">`/api/kullanicilar/</span><span class="p">${</span><span class="nx">id</span><span class="p">}</span><span class="s2">`</span><span class="p">);</span>

  <span class="k">if </span><span class="p">(</span><span class="o">!</span><span class="nx">yanit</span><span class="p">.</span><span class="nx">ok</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">throw</span> <span class="k">new</span> <span class="nc">Error</span><span class="p">(</span><span class="s2">`HTTP hatası: </span><span class="p">${</span><span class="nx">yanit</span><span class="p">.</span><span class="nx">status</span><span class="p">}</span><span class="s2">`</span><span class="p">);</span>
  <span class="p">}</span>

  <span class="k">return</span> <span class="k">await</span> <span class="nx">yanit</span><span class="p">.</span><span class="nf">json</span><span class="p">();</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Bu fonksiyon önce HTTP yanıtını, ardından JSON dönüşümünü bekler. Kod yukarıdan aşağı okunur; fakat iki bekleme sırasında da çalışma ortamı başka görevlerle ilgilenebilir.</p>

<h2 id="hataları-kontrollü-biçimde-yakalamak">Hataları kontrollü biçimde yakalamak</h2>

<p>Asenkron işlemler ağ kesintisi, yetki problemi veya geçersiz veri nedeniyle başarısız olabilir. <code class="language-plaintext highlighter-rouge">try/catch/finally</code>, bu durumları senkron kodlara benzer şekilde yönetir.</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">async</span> <span class="kd">function</span> <span class="nf">profiliGoster</span><span class="p">(</span><span class="nx">id</span><span class="p">)</span> <span class="p">{</span>
  <span class="k">try</span> <span class="p">{</span>
    <span class="kd">const</span> <span class="nx">kullanici</span> <span class="o">=</span> <span class="k">await</span> <span class="nf">kullaniciGetir</span><span class="p">(</span><span class="nx">id</span><span class="p">);</span>
    <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="s2">`</span><span class="p">${</span><span class="nx">kullanici</span><span class="p">.</span><span class="nx">ad</span><span class="p">}</span><span class="s2"> profili yüklendi.`</span><span class="p">);</span>
  <span class="p">}</span> <span class="k">catch </span><span class="p">(</span><span class="nx">hata</span><span class="p">)</span> <span class="p">{</span>
    <span class="nx">console</span><span class="p">.</span><span class="nf">error</span><span class="p">(</span><span class="dl">"</span><span class="s2">Profil yüklenemedi:</span><span class="dl">"</span><span class="p">,</span> <span class="nx">hata</span><span class="p">.</span><span class="nx">message</span><span class="p">);</span>
  <span class="p">}</span> <span class="k">finally</span> <span class="p">{</span>
    <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">Yükleme işlemi sona erdi.</span><span class="dl">"</span><span class="p">);</span>
  <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">finally</code> bloğu başarıdan bağımsız olarak çalıştığı için yükleme göstergesini kapatmak veya kaynakları temizlemek açısından kullanışlıdır.</p>

<h2 id="bağımsız-görevleri-sıraya-dizmeyin">Bağımsız görevleri sıraya dizmeyin</h2>

<p>Her <code class="language-plaintext highlighter-rouge">await</code> ifadesini art arda kullanmak bazen gereksiz beklemeye yol açar. Birbirine bağlı olmayan görevler önce başlatılmalı, sonra birlikte beklenmelidir.</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">async</span> <span class="kd">function</span> <span class="nf">paneliHazirla</span><span class="p">()</span> <span class="p">{</span>
  <span class="kd">const</span> <span class="nx">kullaniciIstegi</span> <span class="o">=</span> <span class="nf">fetch</span><span class="p">(</span><span class="dl">"</span><span class="s2">/api/kullanici</span><span class="dl">"</span><span class="p">);</span>
  <span class="kd">const</span> <span class="nx">bildirimIstegi</span> <span class="o">=</span> <span class="nf">fetch</span><span class="p">(</span><span class="dl">"</span><span class="s2">/api/bildirimler</span><span class="dl">"</span><span class="p">);</span>

  <span class="kd">const</span> <span class="p">[</span><span class="nx">kullaniciYaniti</span><span class="p">,</span> <span class="nx">bildirimYaniti</span><span class="p">]</span> <span class="o">=</span> <span class="k">await</span> <span class="nb">Promise</span><span class="p">.</span><span class="nf">all</span><span class="p">([</span>
    <span class="nx">kullaniciIstegi</span><span class="p">,</span>
    <span class="nx">bildirimIstegi</span>
  <span class="p">]);</span>

  <span class="k">return</span> <span class="p">{</span>
    <span class="na">kullanici</span><span class="p">:</span> <span class="k">await</span> <span class="nx">kullaniciYaniti</span><span class="p">.</span><span class="nf">json</span><span class="p">(),</span>
    <span class="na">bildirimler</span><span class="p">:</span> <span class="k">await</span> <span class="nx">bildirimYaniti</span><span class="p">.</span><span class="nf">json</span><span class="p">()</span>
  <span class="p">};</span>
<span class="p">}</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">Promise.all</code>, işlemleri eşzamanlı başlatır; ancak içlerinden biri reddedilirse tamamı hata verir. Tüm sonuçları başarı veya hata durumlarıyla incelemek gerekiyorsa <code class="language-plaintext highlighter-rouge">Promise.allSettled</code> tercih edilebilir.</p>

<h2 id="küçük-ama-önemli-alışkanlıklar">Küçük ama önemli alışkanlıklar</h2>

<p><code class="language-plaintext highlighter-rouge">await</code> yalnızca gerçekten sonuca ihtiyaç duyulan yerde kullanılmalıdır. Hatalar sessizce yutulmamalı, mümkünse anlamlı bağlamla yeniden fırlatılmalıdır. Ayrıca uzun listelerde sınırsız sayıda isteği aynı anda başlatmak sunucuyu zorlayabilir; görevleri gruplara ayırmak veya eşzamanlılık sınırı uygulamak daha güvenlidir.</p>

<p>Async/await sihir değil, Promise tabanlı akışın daha okunabilir bir yüzüdür. Olay döngüsünü, bağımlı görevleri ve hata yayılımını anladığınızda karmaşık asenkron süreçler ürkütücü bir labirent olmaktan çıkıp düzenli bir yapılacaklar listesine dönüşür.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="JavaScript" /><category term="Async/Await" /><category term="Asenkron Programlama" /><summary type="html"><![CDATA[Bir web servisine istek gönderirken, dosya okurken veya veritabanından kayıt beklerken uygulamanın tamamen durmasını istemeyiz. JavaScript’in async/await sözdizimi, arka planda asenkron çalışan bu işlemleri sanki adım adım ilerleyen senkron kodlarmış gibi yazmamızı sağlar. Sonuç; daha az iç içe fonksiyon, daha anlaşılır hata yönetimi ve geliştiricinin saç baş yolma ihtimalinde kayda değer bir azalmadır.]]></summary></entry><entry><title type="html">DOM Manipülasyonu: JavaScript ile Sayfaya Hayat Vermek</title><link href="https://sonsuzus.github.io/posts/dom-manipulasyonu-javascript-ile-sayfaya-hayat-vermek/" rel="alternate" type="text/html" title="DOM Manipülasyonu: JavaScript ile Sayfaya Hayat Vermek" /><published>2026-07-28T00:00:00+00:00</published><updated>2026-07-28T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/dom-manipulasyonu-javascript-ile-sayfaya-hayat-vermek</id><content type="html" xml:base="https://sonsuzus.github.io/posts/dom-manipulasyonu-javascript-ile-sayfaya-hayat-vermek/"><![CDATA[<p>Bir web sayfasındaki başlığın aniden değişmesi, yeni bir kartın listeye eklenmesi veya bir düğmeye basınca menünün açılması sihir değildir. Perdenin arkasında çoğunlukla JavaScript ve DOM birlikte çalışır. DOM, statik görünen HTML belgesini programlama yoluyla okunabilen ve değiştirilebilen canlı bir yapıya dönüştürür.
``</p>
<h2 id="dom-tam-olarak-nedir">DOM tam olarak nedir?</h2>

<p>DOM, yani <strong>Document Object Model</strong>, tarayıcının HTML belgesini bellekte temsil etmek için oluşturduğu nesne modelidir. Tarayıcı HTML kodunu okur, etiketler arasındaki ebeveyn-çocuk ilişkilerini analiz eder ve hiyerarşik bir ağaç meydana getirir.</p>

<p>Örneğin aşağıdaki belgeyi düşünelim:</p>

<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;body&gt;</span>
  <span class="nt">&lt;main&gt;</span>
    <span class="nt">&lt;h1&gt;</span>Ürünler<span class="nt">&lt;/h1&gt;</span>
    <span class="nt">&lt;ul</span> <span class="na">id=</span><span class="s">"liste"</span><span class="nt">&gt;</span>
      <span class="nt">&lt;li&gt;</span>Klavye<span class="nt">&lt;/li&gt;</span>
    <span class="nt">&lt;/ul&gt;</span>
  <span class="nt">&lt;/main&gt;</span>
<span class="nt">&lt;/body&gt;</span>
</code></pre></div></div>

<p>Bu yapıda <code class="language-plaintext highlighter-rouge">body</code>, <code class="language-plaintext highlighter-rouge">main</code> elemanının; <code class="language-plaintext highlighter-rouge">main</code> ise <code class="language-plaintext highlighter-rouge">h1</code> ve <code class="language-plaintext highlighter-rouge">ul</code> elemanlarının ebeveynidir. <code class="language-plaintext highlighter-rouge">li</code> düğümü de <code class="language-plaintext highlighter-rouge">ul</code> altında bulunur. DOM yalnızca etiketlerden oluşmaz: metinler, yorumlar ve belgenin kendisi de birer düğümdür.</p>

<p>Bir ağacın toplam düğüm sayısını basitçe $N = E + T + C$ biçiminde düşünebiliriz. Burada $E$ elemanları, $T$ metin düğümlerini, $C$ ise yorum düğümlerini temsil eder. Gerçek DOM modeli daha ayrıntılı olsa da bu yaklaşım yapının neden beklenenden kalabalık olabileceğini anlatır.</p>

<table>
  <thead>
    <tr>
      <th>Kavram</th>
      <th>HTML tarafındaki anlamı</th>
      <th>DOM tarafındaki karşılığı</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Etiket</td>
      <td><code class="language-plaintext highlighter-rouge">&lt;button&gt;</code></td>
      <td>Element nesnesi</td>
    </tr>
    <tr>
      <td>Metin</td>
      <td><code class="language-plaintext highlighter-rouge">Kaydet</code></td>
      <td>Text düğümü</td>
    </tr>
    <tr>
      <td>İç içelik</td>
      <td>Etiketlerin sıralanışı</td>
      <td>Ebeveyn-çocuk ilişkisi</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">id</code></td>
      <td>Benzersiz tanımlayıcı</td>
      <td>Seçim için kullanılabilen özellik</td>
    </tr>
    <tr>
      <td>Olay</td>
      <td>HTML’de doğrudan görünmeyebilir</td>
      <td>Tıklama, giriş veya gönderim sinyali</td>
    </tr>
  </tbody>
</table>

<h2 id="elemanları-seçmek-ve-değiştirmek">Elemanları seçmek ve değiştirmek</h2>

<p>DOM manipülasyonunun ilk adımı hedefi bulmaktır. <code class="language-plaintext highlighter-rouge">querySelector</code>, CSS seçicilerini desteklediği için oldukça kullanışlıdır. <code class="language-plaintext highlighter-rouge">querySelectorAll</code> ise eşleşen bütün elemanları bir <code class="language-plaintext highlighter-rouge">NodeList</code> içinde döndürür.</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">baslik</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nf">querySelector</span><span class="p">(</span><span class="dl">"</span><span class="s2">h1</span><span class="dl">"</span><span class="p">);</span>
<span class="kd">const</span> <span class="nx">liste</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nf">querySelector</span><span class="p">(</span><span class="dl">"</span><span class="s2">#liste</span><span class="dl">"</span><span class="p">);</span>

<span class="nx">baslik</span><span class="p">.</span><span class="nx">textContent</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">Teknoloji Ürünleri</span><span class="dl">"</span><span class="p">;</span>
<span class="nx">baslik</span><span class="p">.</span><span class="nx">classList</span><span class="p">.</span><span class="nf">add</span><span class="p">(</span><span class="dl">"</span><span class="s2">vurgulu</span><span class="dl">"</span><span class="p">);</span>

<span class="kd">const</span> <span class="nx">yeniUrun</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nf">createElement</span><span class="p">(</span><span class="dl">"</span><span class="s2">li</span><span class="dl">"</span><span class="p">);</span>
<span class="nx">yeniUrun</span><span class="p">.</span><span class="nx">textContent</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">Mekanik Fare</span><span class="dl">"</span><span class="p">;</span>
<span class="nx">liste</span><span class="p">.</span><span class="nf">appendChild</span><span class="p">(</span><span class="nx">yeniUrun</span><span class="p">);</span>
</code></pre></div></div>

<p>Bu kod önce başlığı ve listeyi bulur. Ardından başlığın güvenli biçimde metnini değiştirir, bir CSS sınıfı ekler ve bellekte yeni bir <code class="language-plaintext highlighter-rouge">li</code> üretip listeye bağlar. <code class="language-plaintext highlighter-rouge">textContent</code>, verilen değeri HTML olarak yorumlamadığı için kullanıcı kaynaklı içeriklerde genellikle <code class="language-plaintext highlighter-rouge">innerHTML</code> kullanımından daha güvenlidir.</p>

<table>
  <thead>
    <tr>
      <th>Yöntem</th>
      <th>Kullanım amacı</th>
      <th>Önemli nokta</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">textContent</code></td>
      <td>Metin okuma veya yazma</td>
      <td>HTML çalıştırmaz</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">innerHTML</code></td>
      <td>HTML parçacığı ekleme</td>
      <td>Güvenilmeyen veride risklidir</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">classList</code></td>
      <td>CSS sınıflarını yönetme</td>
      <td><code class="language-plaintext highlighter-rouge">add</code>, <code class="language-plaintext highlighter-rouge">remove</code>, <code class="language-plaintext highlighter-rouge">toggle</code> sunar</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">createElement</code></td>
      <td>Yeni eleman oluşturma</td>
      <td>Önce bellekte hazırlanır</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">appendChild</code></td>
      <td>Elemanı ağaca bağlama</td>
      <td>Mevcut düğümü taşıyabilir</td>
    </tr>
  </tbody>
</table>

<h2 id="olaylarla-etkileşim-kurmak">Olaylarla etkileşim kurmak</h2>

<p>Dinamiklik yalnızca içerik değiştirmek değildir; kullanıcı davranışına tepki vermek de gerekir. Olay dinleyicileri tam bu noktada sahneye çıkar:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">buton</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nf">querySelector</span><span class="p">(</span><span class="dl">"</span><span class="s2">#urun-ekle</span><span class="dl">"</span><span class="p">);</span>
<span class="kd">let</span> <span class="nx">sayac</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>

<span class="nx">buton</span><span class="p">.</span><span class="nf">addEventListener</span><span class="p">(</span><span class="dl">"</span><span class="s2">click</span><span class="dl">"</span><span class="p">,</span> <span class="p">()</span> <span class="o">=&gt;</span> <span class="p">{</span>
  <span class="kd">const</span> <span class="nx">eleman</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nf">createElement</span><span class="p">(</span><span class="dl">"</span><span class="s2">li</span><span class="dl">"</span><span class="p">);</span>
  <span class="nx">eleman</span><span class="p">.</span><span class="nx">textContent</span> <span class="o">=</span> <span class="s2">`Yeni ürün </span><span class="p">${</span><span class="nx">sayac</span><span class="p">}</span><span class="s2">`</span><span class="p">;</span>
  <span class="nx">liste</span><span class="p">.</span><span class="nf">appendChild</span><span class="p">(</span><span class="nx">eleman</span><span class="p">);</span>
  <span class="nx">sayac</span> <span class="o">+=</span> <span class="mi">1</span><span class="p">;</span>
<span class="p">});</span>
</code></pre></div></div>

<p>Her tıklamada yeni bir liste elemanı oluşturulur. Böylece HTML dosyasını yeniden yüklemeden arayüz güncellenir. Olaylar genellikle hedef elemandan üst düğümlere doğru yayılır; bu davranışa <strong>event bubbling</strong> denir. Çok sayıda benzer eleman varsa her birine dinleyici eklemek yerine ortak ebeveyne tek dinleyici bağlamak, yani olay delegasyonu kullanmak daha verimli olabilir.</p>

<h2 id="performans-ve-güvenlik">Performans ve güvenlik</h2>

<p>DOM işlemleri ücretsiz değildir. Çok sayıda değişiklik tarayıcının yerleşimi yeniden hesaplamasına neden olabilir. $n$ eleman üzerinde tek tek ve ağır işlemler yapmak yaklaşık $O(n)$ maliyet oluştururken, her adımda tüm ağacı yeniden taramak maliyeti büyütebilir. Eleman referanslarını saklamak, değişiklikleri gruplamak ve gerektiğinde <code class="language-plaintext highlighter-rouge">DocumentFragment</code> kullanmak daha akıcı arayüzler sağlar.</p>

<p>Sonuç olarak DOM, HTML ile JavaScript arasındaki köprüdür. Ağacı doğru okuyup güvenli yöntemlerle değiştirdiğinizde statik belgeler; filtrelenen listelere, açılır menülere ve etkileşimli uygulamalara dönüşür. Kısacası HTML sahneyse, DOM dekor düzeni; JavaScript ise dekoru hareket ettiren çalışkan sahne görevlisidir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="JavaScript" /><category term="DOM" /><category term="Web Geliştirme" /><summary type="html"><![CDATA[Bir web sayfasındaki başlığın aniden değişmesi, yeni bir kartın listeye eklenmesi veya bir düğmeye basınca menünün açılması sihir değildir. Perdenin arkasında çoğunlukla JavaScript ve DOM birlikte çalışır. DOM, statik görünen HTML belgesini programlama yoluyla okunabilen ve değiştirilebilen canlı bir yapıya dönüştürür.]]></summary></entry><entry><title type="html">ES6 Sınıfları: JavaScript’in Prototiplerine Takım Elbise Giydirmek</title><link href="https://sonsuzus.github.io/posts/es6-siniflari-javascriptin-prototiplerine-takim-elbise-giydirmek/" rel="alternate" type="text/html" title="ES6 Sınıfları: JavaScript’in Prototiplerine Takım Elbise Giydirmek" /><published>2026-07-28T00:00:00+00:00</published><updated>2026-07-28T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/es6-siniflari-javascriptin-prototiplerine-takim-elbise-giydirmek</id><content type="html" xml:base="https://sonsuzus.github.io/posts/es6-siniflari-javascriptin-prototiplerine-takim-elbise-giydirmek/"><![CDATA[<p>JavaScript’te <code class="language-plaintext highlighter-rouge">class</code> anahtar sözcüğünü gördüğünüzde dilin prototipleri bırakıp C++ veya Java gibi tamamen sınıf tabanlı bir modele geçtiğini düşünebilirsiniz. Fakat perde arkasında hâlâ prototip zinciri çalışır. ES6 sınıfları, mevcut sistemi değiştiren yeni bir nesne modeli değil; yapıcıları, metotları ve kalıtımı daha okunabilir biçimde tanımlayan modern bir sözdizimidir.
``</p>

<h2 id="nesne-yönelimli-düşüncenin-temeli">Nesne yönelimli düşüncenin temeli</h2>

<p>Nesne yönelimli programlama, ilişkili <strong>durum</strong> ve <strong>davranışları</strong> aynı yapı içinde toplar. Örneğin bir banka hesabının bakiyesi durum, para yatırma işlemi ise davranıştır. Bunu kabaca şu şekilde ifade edebiliriz:</p>

\[Nesne = Durum + Davranış\]

<p>JavaScript’te nesneler başka bir nesneyi prototip olarak kullanabilir. Bir özellik nesnenin kendisinde bulunamazsa motor, prototip zincirinde yukarı doğru arama yapar. Zincirin derinliği $d$ ise en kötü durumdaki aramayı basitleştirilmiş biçimde $T(d)=O(d)$ olarak gösterebiliriz.</p>

<p>ES6 öncesinde yapıcı fonksiyon ve <code class="language-plaintext highlighter-rouge">prototype</code> kullanmak yaygındı:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">function</span> <span class="nf">Kullanici</span><span class="p">(</span><span class="nx">ad</span><span class="p">,</span> <span class="nx">puan</span><span class="p">)</span> <span class="p">{</span>
  <span class="k">this</span><span class="p">.</span><span class="nx">ad</span> <span class="o">=</span> <span class="nx">ad</span><span class="p">;</span>
  <span class="k">this</span><span class="p">.</span><span class="nx">puan</span> <span class="o">=</span> <span class="nx">puan</span><span class="p">;</span>
<span class="p">}</span>

<span class="nx">Kullanici</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">selamla</span> <span class="o">=</span> <span class="nf">function </span><span class="p">()</span> <span class="p">{</span>
  <span class="k">return</span> <span class="s2">`Merhaba, ben </span><span class="p">${</span><span class="k">this</span><span class="p">.</span><span class="nx">ad</span><span class="p">}</span><span class="s2">!`</span><span class="p">;</span>
<span class="p">};</span>
</code></pre></div></div>

<p>Bu kod geçerlidir; ancak yapıcı ile prototip metotları farklı yerlerde tanımlandığı için yapı büyüdükçe takip edilmesi zorlaşabilir.</p>

<h2 id="class-ve-constructor-kullanımı">Class ve constructor kullanımı</h2>

<p>Aynı modeli ES6 sınıf sözdizimiyle daha toplu yazabiliriz:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">class</span> <span class="nc">Kullanici</span> <span class="p">{</span>
  <span class="nf">constructor</span><span class="p">(</span><span class="nx">ad</span><span class="p">,</span> <span class="nx">puan</span> <span class="o">=</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">this</span><span class="p">.</span><span class="nx">ad</span> <span class="o">=</span> <span class="nx">ad</span><span class="p">;</span>
    <span class="k">this</span><span class="p">.</span><span class="nx">puan</span> <span class="o">=</span> <span class="nx">puan</span><span class="p">;</span>
  <span class="p">}</span>

  <span class="nf">selamla</span><span class="p">()</span> <span class="p">{</span>
    <span class="k">return</span> <span class="s2">`Merhaba, ben </span><span class="p">${</span><span class="k">this</span><span class="p">.</span><span class="nx">ad</span><span class="p">}</span><span class="s2">!`</span><span class="p">;</span>
  <span class="p">}</span>

  <span class="nf">puanEkle</span><span class="p">(</span><span class="nx">miktar</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">this</span><span class="p">.</span><span class="nx">puan</span> <span class="o">+=</span> <span class="nx">miktar</span><span class="p">;</span>
  <span class="p">}</span>
<span class="p">}</span>

<span class="kd">const</span> <span class="nx">ada</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">Kullanici</span><span class="p">(</span><span class="dl">"</span><span class="s2">Ada</span><span class="dl">"</span><span class="p">,</span> <span class="mi">10</span><span class="p">);</span>
<span class="nx">ada</span><span class="p">.</span><span class="nf">puanEkle</span><span class="p">(</span><span class="mi">5</span><span class="p">);</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">ada</span><span class="p">.</span><span class="nx">puan</span><span class="p">);</span> <span class="c1">// 15</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">constructor</code>, <code class="language-plaintext highlighter-rouge">new</code> ile nesne oluşturulduğunda otomatik çalışan özel metottur. Başlangıç değerlerini nesneye yerleştirir. Sınıf gövdesindeki normal metotlar her nesne için yeniden kopyalanmaz; sınıfın <code class="language-plaintext highlighter-rouge">prototype</code> nesnesine eklenerek örnekler arasında paylaşılır.</p>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>Yapıcı fonksiyon</th>
      <th>ES6 sınıfı</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Tanımlama</td>
      <td><code class="language-plaintext highlighter-rouge">function</code> kullanır</td>
      <td><code class="language-plaintext highlighter-rouge">class</code> kullanır</td>
    </tr>
    <tr>
      <td>Başlatma</td>
      <td>Fonksiyon gövdesinde</td>
      <td><code class="language-plaintext highlighter-rouge">constructor</code> içinde</td>
    </tr>
    <tr>
      <td>Metotlar</td>
      <td><code class="language-plaintext highlighter-rouge">prototype</code> üzerine eklenir</td>
      <td>Sınıf gövdesinde yazılır</td>
    </tr>
    <tr>
      <td>Kalıtım</td>
      <td>Elle prototip bağlantısı gerekir</td>
      <td><code class="language-plaintext highlighter-rouge">extends</code> ve <code class="language-plaintext highlighter-rouge">super</code> kullanılır</td>
    </tr>
    <tr>
      <td>Okunabilirlik</td>
      <td>Dağınık hâle gelebilir</td>
      <td>Daha düzenli ve tanıdıktır</td>
    </tr>
  </tbody>
</table>

<h2 id="kalıtım-extends-ve-super">Kalıtım: extends ve super</h2>

<p>Bir sınıfın davranışlarını genişletmek için <code class="language-plaintext highlighter-rouge">extends</code> kullanılır. Alt sınıfın yapıcısında <code class="language-plaintext highlighter-rouge">this</code> kullanılmadan önce <code class="language-plaintext highlighter-rouge">super()</code> çağrılmalıdır; çünkü önce üst sınıfın nesne kurulumunu tamamlaması gerekir.</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">class</span> <span class="nc">Yonetici</span> <span class="kd">extends</span> <span class="nc">Kullanici</span> <span class="p">{</span>
  <span class="nf">constructor</span><span class="p">(</span><span class="nx">ad</span><span class="p">,</span> <span class="nx">puan</span><span class="p">,</span> <span class="nx">yetki</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">super</span><span class="p">(</span><span class="nx">ad</span><span class="p">,</span> <span class="nx">puan</span><span class="p">);</span>
    <span class="k">this</span><span class="p">.</span><span class="nx">yetki</span> <span class="o">=</span> <span class="nx">yetki</span><span class="p">;</span>
  <span class="p">}</span>

  <span class="nf">selamla</span><span class="p">()</span> <span class="p">{</span>
    <span class="k">return</span> <span class="s2">`</span><span class="p">${</span><span class="k">super</span><span class="p">.</span><span class="nf">selamla</span><span class="p">()}</span><span class="s2"> Yetkim: </span><span class="p">${</span><span class="k">this</span><span class="p">.</span><span class="nx">yetki</span><span class="p">}</span><span class="s2">`</span><span class="p">;</span>
  <span class="p">}</span>
<span class="p">}</span>

<span class="kd">const</span> <span class="nx">linus</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">Yonetici</span><span class="p">(</span><span class="dl">"</span><span class="s2">Linus</span><span class="dl">"</span><span class="p">,</span> <span class="mi">100</span><span class="p">,</span> <span class="dl">"</span><span class="s2">sistem</span><span class="dl">"</span><span class="p">);</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">linus</span><span class="p">.</span><span class="nf">selamla</span><span class="p">());</span>
</code></pre></div></div>

<p>Burada <code class="language-plaintext highlighter-rouge">Yonetici.prototype</code>, dolaylı olarak <code class="language-plaintext highlighter-rouge">Kullanici.prototype</code> nesnesine bağlanır. Dolayısıyla kalıtımın motoru yine prototip zinciridir; <code class="language-plaintext highlighter-rouge">extends</code> yalnızca bu bağlantıyı güvenli ve anlaşılır biçimde kurar.</p>

<h2 id="küçük-ama-önemli-ayrıntılar">Küçük ama önemli ayrıntılar</h2>

<p>Sınıflar otomatik olarak strict mode içinde çalışır. Ayrıca sınıf bildirimi, fonksiyon bildiriminin aksine tanımlanmadan önce güvenle kullanılamaz. <code class="language-plaintext highlighter-rouge">static</code> ile yazılan metotlar örneklere değil doğrudan sınıfa aittir:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">class</span> <span class="nc">MatematikAraci</span> <span class="p">{</span>
  <span class="kd">static</span> <span class="nf">ikiKat</span><span class="p">(</span><span class="nx">sayi</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">return</span> <span class="nx">sayi</span> <span class="o">*</span> <span class="mi">2</span><span class="p">;</span>
  <span class="p">}</span>
<span class="p">}</span>

<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">MatematikAraci</span><span class="p">.</span><span class="nf">ikiKat</span><span class="p">(</span><span class="mi">6</span><span class="p">));</span> <span class="c1">// 12</span>
</code></pre></div></div>

<p>Sonuç olarak ES6 sınıfları JavaScript’i klasik sınıf tabanlı bir dile dönüştürmez. Prototip modeline daha tanıdık, düzenli ve bakımı kolay bir arayüz sunar. Sihir yoktur; yalnızca prototiplerin üzerine giydirilmiş oldukça şık bir takım elbise vardır.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="JavaScript" /><category term="ES6" /><category term="Nesne Yönelimli Programlama" /><summary type="html"><![CDATA[JavaScript’te class anahtar sözcüğünü gördüğünüzde dilin prototipleri bırakıp C++ veya Java gibi tamamen sınıf tabanlı bir modele geçtiğini düşünebilirsiniz. Fakat perde arkasında hâlâ prototip zinciri çalışır. ES6 sınıfları, mevcut sistemi değiştiren yeni bir nesne modeli değil; yapıcıları, metotları ve kalıtımı daha okunabilir biçimde tanımlayan modern bir sözdizimidir.]]></summary></entry><entry><title type="html">Fonksiyonlar Sahneye Çıkıyor: Birinci Sınıf Vatandaşlık ve Arrow Function’lar</title><link href="https://sonsuzus.github.io/posts/fonksiyonlar-sahneye-cikiyor-birinci-sinif-vatandaslik-ve-arrow-functionlar/" rel="alternate" type="text/html" title="Fonksiyonlar Sahneye Çıkıyor: Birinci Sınıf Vatandaşlık ve Arrow Function’lar" /><published>2026-07-28T00:00:00+00:00</published><updated>2026-07-28T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/fonksiyonlar-sahneye-cikiyor-birinci-sinif-vatandaslik-ve-arrow-functionlar</id><content type="html" xml:base="https://sonsuzus.github.io/posts/fonksiyonlar-sahneye-cikiyor-birinci-sinif-vatandaslik-ve-arrow-functionlar/"><![CDATA[<p>Programlamada fonksiyonları yalnızca çağrıldığında çalışan kod paketleri olarak düşünmek eksik kalır. JavaScript gibi dillerde fonksiyonlar aynı zamanda değişkenlere atanabilir, başka fonksiyonlara gönderilebilir ve sonuç olarak döndürülebilir. Kısacası fonksiyonlar, dilin ayrıcalıklı üyeleri değil; diğer değerlerle aynı haklara sahip <strong>birinci sınıf vatandaşlarıdır</strong>.</p>

<p>``</p>

<h2 id="birinci-sınıf-vatandaş-ne-demektir">Birinci sınıf vatandaş ne demektir?</h2>

<p>Bir programlama dilinde bir değer aşağıdaki işlemleri destekliyorsa genellikle birinci sınıf kabul edilir:</p>

<ul>
  <li>Bir değişkene atanabilir.</li>
  <li>Veri yapılarında saklanabilir.</li>
  <li>Fonksiyonlara parametre olarak geçirilebilir.</li>
  <li>Başka bir fonksiyondan döndürülebilir.</li>
</ul>

<p>JavaScript fonksiyonları bu koşulların tamamını karşılar. Matematiksel açıdan bir fonksiyonu $f: A \rightarrow B$ biçiminde gösteririz. Bu ifade, $f$ fonksiyonunun $A$ kümesindeki bir girdiyi $B$ kümesindeki bir çıktıya dönüştürdüğünü söyler. Programlamadaki önemli fark, $f$ değerinin kendisini de taşıyabilmemizdir.</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">topla</span> <span class="o">=</span> <span class="nf">function </span><span class="p">(</span><span class="nx">a</span><span class="p">,</span> <span class="nx">b</span><span class="p">)</span> <span class="p">{</span>
  <span class="k">return</span> <span class="nx">a</span> <span class="o">+</span> <span class="nx">b</span><span class="p">;</span>
<span class="p">};</span>

<span class="kd">const</span> <span class="nx">hesapla</span> <span class="o">=</span> <span class="nx">topla</span><span class="p">;</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nf">hesapla</span><span class="p">(</span><span class="mi">4</span><span class="p">,</span> <span class="mi">6</span><span class="p">));</span> <span class="c1">// 10</span>
</code></pre></div></div>

<p>Burada <code class="language-plaintext highlighter-rouge">topla</code> fonksiyonu çalıştırılmadan <code class="language-plaintext highlighter-rouge">hesapla</code> değişkenine atanır. Parantez kullanılmaması kritiktir: <code class="language-plaintext highlighter-rouge">topla</code> fonksiyonun kendisini, <code class="language-plaintext highlighter-rouge">topla()</code> ise fonksiyon çağrısının sonucunu ifade eder.</p>

<h2 id="fonksiyonları-parametre-olarak-geçirmek">Fonksiyonları parametre olarak geçirmek</h2>

<p>Bir fonksiyona başka bir fonksiyon verilmesine <strong>callback</strong> yaklaşımı denir. Callback alan fonksiyon ise yüksek dereceli fonksiyondur. Bu yapı, davranışı veriden ayırarak tekrar kullanılabilir kod üretmemizi sağlar.</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">function</span> <span class="nf">uygula</span><span class="p">(</span><span class="nx">sayi</span><span class="p">,</span> <span class="nx">islem</span><span class="p">)</span> <span class="p">{</span>
  <span class="k">return</span> <span class="nf">islem</span><span class="p">(</span><span class="nx">sayi</span><span class="p">);</span>
<span class="p">}</span>

<span class="kd">const</span> <span class="nx">ikiyleCarp</span> <span class="o">=</span> <span class="nx">x</span> <span class="o">=&gt;</span> <span class="nx">x</span> <span class="o">*</span> <span class="mi">2</span><span class="p">;</span>
<span class="kd">const</span> <span class="nx">karesiniAl</span> <span class="o">=</span> <span class="nx">x</span> <span class="o">=&gt;</span> <span class="nx">x</span> <span class="o">**</span> <span class="mi">2</span><span class="p">;</span>

<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nf">uygula</span><span class="p">(</span><span class="mi">5</span><span class="p">,</span> <span class="nx">ikiyleCarp</span><span class="p">));</span> <span class="c1">// 10</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nf">uygula</span><span class="p">(</span><span class="mi">5</span><span class="p">,</span> <span class="nx">karesiniAl</span><span class="p">));</span> <span class="c1">// 25</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">uygula</code>, hangi hesabın yapılacağını bilmez; yalnızca aldığı davranışı çalıştırır. Matematiksel olarak bunu $uygula(x, f) = f(x)$ şeklinde düşünebiliriz. Böylece aynı mekanizma, farklı fonksiyonlarla farklı sonuçlar üretir.</p>

<h2 id="fonksiyondan-fonksiyon-döndürmek">Fonksiyondan fonksiyon döndürmek</h2>

<p>Fonksiyonlar sonuç olarak da üretilebilir. Bu teknik yapılandırılabilir ve özelleştirilebilir işlemler oluşturmak için kullanışlıdır.</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">function</span> <span class="nf">carpaniOlustur</span><span class="p">(</span><span class="nx">carpan</span><span class="p">)</span> <span class="p">{</span>
  <span class="k">return</span> <span class="nx">sayi</span> <span class="o">=&gt;</span> <span class="nx">sayi</span> <span class="o">*</span> <span class="nx">carpan</span><span class="p">;</span>
<span class="p">}</span>

<span class="kd">const</span> <span class="nx">ucleCarp</span> <span class="o">=</span> <span class="nf">carpaniOlustur</span><span class="p">(</span><span class="mi">3</span><span class="p">);</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nf">ucleCarp</span><span class="p">(</span><span class="mi">7</span><span class="p">));</span> <span class="c1">// 21</span>
</code></pre></div></div>

<p>Döndürülen fonksiyon, dış fonksiyon tamamlandıktan sonra bile <code class="language-plaintext highlighter-rouge">carpan</code> değerini hatırlar. Bu davranışa <strong>closure</strong> denir. Adeta fonksiyon küçük bir sırt çantası taşır ve doğduğu kapsamın değişkenlerini yanında götürür.</p>

<h2 id="arrow-function-avantajları">Arrow function avantajları</h2>

<p>Arrow function sözdizimi özellikle kısa callback ifadelerinde kodu sadeleştirir.</p>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>Klasik fonksiyon</th>
      <th>Arrow function</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Yazım</td>
      <td><code class="language-plaintext highlighter-rouge">function (x) { return x * 2; }</code></td>
      <td><code class="language-plaintext highlighter-rouge">x =&gt; x * 2</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">this</code> davranışı</td>
      <td>Çağrılma biçimine göre belirlenir</td>
      <td>Dış kapsamdaki <code class="language-plaintext highlighter-rouge">this</code> değerini kullanır</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">arguments</code> nesnesi</td>
      <td>Bulunur</td>
      <td>Bulunmaz</td>
    </tr>
    <tr>
      <td>Constructor kullanımı</td>
      <td><code class="language-plaintext highlighter-rouge">new</code> ile kullanılabilir</td>
      <td><code class="language-plaintext highlighter-rouge">new</code> ile kullanılamaz</td>
    </tr>
    <tr>
      <td>Kısa callback uygunluğu</td>
      <td>Daha uzun</td>
      <td>Genellikle daha okunaklı</td>
    </tr>
  </tbody>
</table>

<p>Tek ifadeli arrow function’larda <code class="language-plaintext highlighter-rouge">return</code> ve süslü parantezler çıkarılabilir:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">fiyatlar</span> <span class="o">=</span> <span class="p">[</span><span class="mi">100</span><span class="p">,</span> <span class="mi">200</span><span class="p">,</span> <span class="mi">300</span><span class="p">];</span>
<span class="kd">const</span> <span class="nx">kdvliFiyatlar</span> <span class="o">=</span> <span class="nx">fiyatlar</span><span class="p">.</span><span class="nf">map</span><span class="p">(</span><span class="nx">fiyat</span> <span class="o">=&gt;</span> <span class="nx">fiyat</span> <span class="o">*</span> <span class="mf">1.20</span><span class="p">);</span>
</code></pre></div></div>

<p>Ancak arrow function her durumda daha iyi değildir. Nesne metotlarında dinamik <code class="language-plaintext highlighter-rouge">this</code> gerekiyorsa klasik fonksiyon tercih edilmelidir.</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">kullanici</span> <span class="o">=</span> <span class="p">{</span>
  <span class="na">ad</span><span class="p">:</span> <span class="dl">"</span><span class="s2">Ada</span><span class="dl">"</span><span class="p">,</span>
  <span class="nf">selamla</span><span class="p">()</span> <span class="p">{</span>
    <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="s2">`Merhaba, </span><span class="p">${</span><span class="k">this</span><span class="p">.</span><span class="nx">ad</span><span class="p">}</span><span class="s2">!`</span><span class="p">);</span>
  <span class="p">}</span>
<span class="p">};</span>
</code></pre></div></div>

<p>Sonuç olarak birinci sınıf fonksiyonlar; callback, closure, olay yönetimi ve fonksiyonel programlama gibi pek çok yaklaşımın temelidir. Arrow function’lar bu gücü kısa bir sözdizimiyle sunar, fakat <code class="language-plaintext highlighter-rouge">this</code> ve constructor farklılıkları unutulmamalıdır. Fonksiyonları yalnızca çalışan bloklar değil, taşınabilen ve birleştirilebilen değerler olarak gördüğünüzde JavaScript çok daha esnek bir oyun alanına dönüşür.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="JavaScript" /><category term="Fonksiyonel Programlama" /><category term="Arrow Functions" /><summary type="html"><![CDATA[Programlamada fonksiyonları yalnızca çağrıldığında çalışan kod paketleri olarak düşünmek eksik kalır. JavaScript gibi dillerde fonksiyonlar aynı zamanda değişkenlere atanabilir, başka fonksiyonlara gönderilebilir ve sonuç olarak döndürülebilir. Kısacası fonksiyonlar, dilin ayrıcalıklı üyeleri değil; diğer değerlerle aynı haklara sahip birinci sınıf vatandaşlarıdır.]]></summary></entry><entry><title type="html">JavaScript Dizileri ve Yüksek Mertebe Metotlarla Veriyi Dönüştürme</title><link href="https://sonsuzus.github.io/posts/javascript-dizileri-ve-yuksek-mertebe-metotlarla-veriyi-donusturme/" rel="alternate" type="text/html" title="JavaScript Dizileri ve Yüksek Mertebe Metotlarla Veriyi Dönüştürme" /><published>2026-07-28T00:00:00+00:00</published><updated>2026-07-28T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/javascript-dizileri-ve-yuksek-mertebe-metotlarla-veriyi-donusturme</id><content type="html" xml:base="https://sonsuzus.github.io/posts/javascript-dizileri-ve-yuksek-mertebe-metotlarla-veriyi-donusturme/"><![CDATA[<p>Bir alışveriş sepetindeki ürünlerden sınav notlarına kadar pek çok veri, yazılım dünyasında listeler hâlinde karşımıza çıkar. JavaScript dizileri bu verileri tek bir değişkende düzenli biçimde saklarken <code class="language-plaintext highlighter-rouge">map</code>, <code class="language-plaintext highlighter-rouge">filter</code> ve <code class="language-plaintext highlighter-rouge">reduce</code> gibi yüksek mertebe metotlar, döngü karmaşasına kapılmadan verileri dönüştürmemizi sağlar.
``</p>
<h2 id="dizi-nedir">Dizi nedir?</h2>

<p>Dizi, birden fazla değeri sıralı biçimde saklayan veri yapısıdır. JavaScript’te köşeli parantezlerle oluşturulur ve her elemanın sıfırdan başlayan bir indeksi vardır.</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">diller</span> <span class="o">=</span> <span class="p">[</span><span class="dl">"</span><span class="s2">JavaScript</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">Python</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">Go</span><span class="dl">"</span><span class="p">];</span>

<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">diller</span><span class="p">[</span><span class="mi">0</span><span class="p">]);</span> <span class="c1">// JavaScript</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">diller</span><span class="p">.</span><span class="nx">length</span><span class="p">);</span> <span class="c1">// 3</span>
</code></pre></div></div>

<p>Bir dizide $n$ eleman varsa geçerli indeksler $0$ ile $n-1$ arasındadır. Örneğin üç elemanlı bir dizinin son elemanı <code class="language-plaintext highlighter-rouge">diller[2]</code> olur. Son elemana daha okunaklı biçimde <code class="language-plaintext highlighter-rouge">diller.at(-1)</code> kullanılarak da erişilebilir.</p>

<p>Diziler yalnızca metin değil; sayı, nesne ve hatta başka diziler barındırabilir. Yine de uygulamada aynı amaca hizmet eden verileri bir arada tutmak kodun anlaşılmasını kolaylaştırır.</p>

<h2 id="yüksek-mertebe-metot-nedir">Yüksek mertebe metot nedir?</h2>

<p>Yüksek mertebe fonksiyon, başka bir fonksiyonu parametre olarak alabilen veya sonuç olarak fonksiyon döndürebilen fonksiyondur. Dizi metotları, her eleman için çalıştırılacak bir geri çağırma fonksiyonu alır.</p>

<table>
  <thead>
    <tr>
      <th>Metot</th>
      <th>Temel amaç</th>
      <th>Sonuç</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">map</code></td>
      <td>Her elemanı dönüştürmek</td>
      <td>Aynı uzunlukta yeni dizi</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">filter</code></td>
      <td>Koşula uyanları seçmek</td>
      <td>Yeni ve çoğunlukla daha kısa dizi</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">reduce</code></td>
      <td>Elemanları tek sonuçta birleştirmek</td>
      <td>Sayı, nesne, dizi veya başka bir değer</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">forEach</code></td>
      <td>Her eleman için işlem yapmak</td>
      <td><code class="language-plaintext highlighter-rouge">undefined</code></td>
    </tr>
  </tbody>
</table>

<p>Bu metotlar kaynak diziyi doğrudan değiştirmez. Böylece beklenmedik yan etkiler azalır ve veri akışı daha kolay takip edilir.</p>

<h2 id="map-her-elemanı-dönüştür"><code class="language-plaintext highlighter-rouge">map</code>: Her elemanı dönüştür</h2>

<p><code class="language-plaintext highlighter-rouge">map</code>, dizideki her elemanı verilen fonksiyondan geçirir. Matematiksel olarak bir $f$ fonksiyonunun tüm elemanlara uygulanması gibi düşünülebilir:</p>

\[[x_1,x_2,\ldots,x_n] \rightarrow [f(x_1),f(x_2),\ldots,f(x_n)]\]

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">fiyatlar</span> <span class="o">=</span> <span class="p">[</span><span class="mi">100</span><span class="p">,</span> <span class="mi">250</span><span class="p">,</span> <span class="mi">80</span><span class="p">];</span>
<span class="kd">const</span> <span class="nx">kdvliFiyatlar</span> <span class="o">=</span> <span class="nx">fiyatlar</span><span class="p">.</span><span class="nf">map</span><span class="p">((</span><span class="nx">fiyat</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="nx">fiyat</span> <span class="o">*</span> <span class="mf">1.20</span><span class="p">);</span>

<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">kdvliFiyatlar</span><span class="p">);</span> <span class="c1">// [120, 300, 96]</span>
</code></pre></div></div>

<p>Burada her fiyat yüzde 20 KDV eklenerek dönüştürülür. Orijinal <code class="language-plaintext highlighter-rouge">fiyatlar</code> dizisi değişmez.</p>

<h2 id="filter-i̇stenmeyenleri-ele"><code class="language-plaintext highlighter-rouge">filter</code>: İstenmeyenleri ele</h2>

<p><code class="language-plaintext highlighter-rouge">filter</code>, geri çağırma fonksiyonu <code class="language-plaintext highlighter-rouge">true</code> döndüren elemanları yeni diziye taşır. Bir sınıftaki başarılı notları seçelim:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">notlar</span> <span class="o">=</span> <span class="p">[</span><span class="mi">45</span><span class="p">,</span> <span class="mi">82</span><span class="p">,</span> <span class="mi">67</span><span class="p">,</span> <span class="mi">30</span><span class="p">,</span> <span class="mi">91</span><span class="p">];</span>
<span class="kd">const</span> <span class="nx">basariliNotlar</span> <span class="o">=</span> <span class="nx">notlar</span><span class="p">.</span><span class="nf">filter</span><span class="p">((</span><span class="nx">not</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="nx">not</span> <span class="o">&gt;=</span> <span class="mi">50</span><span class="p">);</span>

<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">basariliNotlar</span><span class="p">);</span> <span class="c1">// [82, 67, 91]</span>
</code></pre></div></div>

<p>Koşul bir süzgeç gibi çalışır. En kötü durumda bütün elemanlar incelendiği için zaman karmaşıklığı $O(n)$ olur.</p>

<h2 id="reduce-diziyi-tek-sonuca-indir"><code class="language-plaintext highlighter-rouge">reduce</code>: Diziyi tek sonuca indir</h2>

<p><code class="language-plaintext highlighter-rouge">reduce</code>, biriktirici ve mevcut eleman üzerinden ilerler. İkinci argüman başlangıç değeridir; verilmesi, özellikle boş dizilerde hata riskini azaltır.</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">sepet</span> <span class="o">=</span> <span class="p">[</span>
  <span class="p">{</span> <span class="na">ad</span><span class="p">:</span> <span class="dl">"</span><span class="s2">Klavye</span><span class="dl">"</span><span class="p">,</span> <span class="na">fiyat</span><span class="p">:</span> <span class="mi">900</span> <span class="p">},</span>
  <span class="p">{</span> <span class="na">ad</span><span class="p">:</span> <span class="dl">"</span><span class="s2">Fare</span><span class="dl">"</span><span class="p">,</span> <span class="na">fiyat</span><span class="p">:</span> <span class="mi">500</span> <span class="p">},</span>
  <span class="p">{</span> <span class="na">ad</span><span class="p">:</span> <span class="dl">"</span><span class="s2">Kulaklık</span><span class="dl">"</span><span class="p">,</span> <span class="na">fiyat</span><span class="p">:</span> <span class="mi">1200</span> <span class="p">}</span>
<span class="p">];</span>

<span class="kd">const</span> <span class="nx">toplam</span> <span class="o">=</span> <span class="nx">sepet</span><span class="p">.</span><span class="nf">reduce</span><span class="p">(</span>
  <span class="p">(</span><span class="nx">biriken</span><span class="p">,</span> <span class="nx">urun</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="nx">biriken</span> <span class="o">+</span> <span class="nx">urun</span><span class="p">.</span><span class="nx">fiyat</span><span class="p">,</span>
  <span class="mi">0</span>
<span class="p">);</span>

<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">toplam</span><span class="p">);</span> <span class="c1">// 2600</span>
</code></pre></div></div>

<p>Toplam, matematiksel olarak $\sum_{i=1}^{n} fiyat_i$ işlemidir. Biriktirici başlangıçta <code class="language-plaintext highlighter-rouge">0</code> değerini alır ve her ürünün fiyatıyla güncellenir.</p>

<h2 id="metotları-zincirlemek">Metotları zincirlemek</h2>

<p>Asıl eğlence metotlar birleştiğinde başlar. Önce pahalı ürünleri seçip sonra adlarını dönüştürebiliriz:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">pahaliUrunAdlari</span> <span class="o">=</span> <span class="nx">sepet</span>
  <span class="p">.</span><span class="nf">filter</span><span class="p">((</span><span class="nx">urun</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="nx">urun</span><span class="p">.</span><span class="nx">fiyat</span> <span class="o">&gt;=</span> <span class="mi">800</span><span class="p">)</span>
  <span class="p">.</span><span class="nf">map</span><span class="p">((</span><span class="nx">urun</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="nx">urun</span><span class="p">.</span><span class="nx">ad</span><span class="p">.</span><span class="nf">toUpperCase</span><span class="p">());</span>

<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">pahaliUrunAdlari</span><span class="p">);</span> <span class="c1">// ["KLAVYE", "KULAKLIK"]</span>
</code></pre></div></div>

<p>Her zincir halkası yeni bir sonuç üretir. Ancak her metot diziyi ayrı dolaştığından devasa veri kümelerinde gereksiz zincirler maliyet yaratabilir. Günlük uygulamalarda ise okunabilirlik kazancı çoğunlukla daha değerlidir.</p>

<p>Kısacası <code class="language-plaintext highlighter-rouge">map</code> dönüştürür, <code class="language-plaintext highlighter-rouge">filter</code> seçer, <code class="language-plaintext highlighter-rouge">reduce</code> biriktirir. Hangi metodu kullanacağınıza karar verirken “Yeni bir liste mi, seçilmiş elemanlar mı, yoksa tek bir sonuç mu istiyorum?” sorusunu sormanız yeterlidir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="JavaScript" /><category term="Diziler" /><category term="Fonksiyonel Programlama" /><summary type="html"><![CDATA[Bir alışveriş sepetindeki ürünlerden sınav notlarına kadar pek çok veri, yazılım dünyasında listeler hâlinde karşımıza çıkar. JavaScript dizileri bu verileri tek bir değişkende düzenli biçimde saklarken map, filter ve reduce gibi yüksek mertebe metotlar, döngü karmaşasına kapılmadan verileri dönüştürmemizi sağlar.]]></summary></entry><entry><title type="html">JavaScript Kurulumu: Tarayıcı Konsolundan VS Code ve Node.js’e</title><link href="https://sonsuzus.github.io/posts/javascript-kurulumu-tarayici-konsolundan-vs-code-ve-nodejse/" rel="alternate" type="text/html" title="JavaScript Kurulumu: Tarayıcı Konsolundan VS Code ve Node.js’e" /><published>2026-07-28T00:00:00+00:00</published><updated>2026-07-28T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/javascript-kurulumu-tarayici-konsolundan-vs-code-ve-nodejse</id><content type="html" xml:base="https://sonsuzus.github.io/posts/javascript-kurulumu-tarayici-konsolundan-vs-code-ve-nodejse/"><![CDATA[<p>JavaScript öğrenmeye başlamak için devasa bir kurulum sihrine ihtiyacınız yoktur; modern bir tarayıcı bile ilk programınızı çalıştırmaya yeter. Ancak gerçek projeler geliştirmek istediğinizde tarayıcı konsolu, Node.js, VS Code ve canlı sunucu araçlarından oluşan düzenli bir çalışma ortamı kurmak büyük rahatlık sağlar. Gelin JavaScript atölyemizin ışıklarını birlikte açalım.
``</p>
<h2 id="javascript-nerede-çalışır">JavaScript nerede çalışır?</h2>

<p>JavaScript kodunu çalıştıran temel bileşene <strong>JavaScript motoru</strong> denir. Google Chrome ve Node.js, V8 motorunu kullanır. Firefox ise SpiderMonkey adlı farklı bir motora sahiptir. Motor, yazdığımız kaynak kodunu bilgisayarın işleyebileceği komutlara dönüştürür.</p>

<p>Bir programın yaklaşık çalışma süresini teorik olarak şöyle düşünebiliriz:</p>

\[T_{toplam} = T_{ayrıştırma} + T_{derleme} + T_{çalıştırma}\]

<p>Modern motorlar, sık kullanılan kodları çalışma sırasında optimize eden <strong>JIT (Just-in-Time)</strong> derleme yöntemlerinden yararlanır. Dolayısıyla JavaScript yalnızca “satır satır okunan basit bir betik dili” değildir.</p>

<table>
  <thead>
    <tr>
      <th>Ortam</th>
      <th>Temel kullanım</th>
      <th style="text-align: right">Tarayıcı API’leri</th>
      <th style="text-align: right">Dosya sistemi erişimi</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Tarayıcı konsolu</td>
      <td>Deneme ve hata ayıklama</td>
      <td style="text-align: right">Var</td>
      <td style="text-align: right">Kısıtlı</td>
    </tr>
    <tr>
      <td>HTML içindeki JavaScript</td>
      <td>Web arayüzleri</td>
      <td style="text-align: right">Var</td>
      <td style="text-align: right">Kısıtlı</td>
    </tr>
    <tr>
      <td>Node.js</td>
      <td>Sunucu ve komut satırı uygulamaları</td>
      <td style="text-align: right">Yok</td>
      <td style="text-align: right">Var</td>
    </tr>
  </tbody>
</table>

<h2 id="tarayıcı-konsoluyla-ilk-buluşma">Tarayıcı konsoluyla ilk buluşma</h2>

<p>Chrome, Edge veya Firefox’ta <code class="language-plaintext highlighter-rouge">F12</code> tuşuna basarak geliştirici araçlarını açın ve <strong>Console</strong> sekmesine geçin. Burada herhangi bir dosya oluşturmadan JavaScript çalıştırabilirsiniz:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">ad</span> <span class="o">=</span> <span class="dl">'</span><span class="s1">Ada</span><span class="dl">'</span><span class="p">;</span>
<span class="kd">const</span> <span class="nx">dersSayisi</span> <span class="o">=</span> <span class="mi">3</span><span class="p">;</span>

<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="s2">`Merhaba </span><span class="p">${</span><span class="nx">ad</span><span class="p">}</span><span class="s2">! Bugün </span><span class="p">${</span><span class="nx">dersSayisi</span><span class="p">}</span><span class="s2"> ders var.`</span><span class="p">);</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">table</span><span class="p">({</span> <span class="nx">ad</span><span class="p">,</span> <span class="nx">dersSayisi</span> <span class="p">});</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">console.log</code> değerleri görüntülerken <code class="language-plaintext highlighter-rouge">console.table</code>, nesneleri tablo biçiminde sunar. Konsol hızlı deneyler için harikadır; fakat yazdığınız komutlar kalıcı bir proje düzeni oluşturmaz.</p>

<h2 id="nodejs-kurulumu">Node.js kurulumu</h2>

<p>Node.js, JavaScript’i tarayıcı dışında çalıştıran bir çalışma zamanıdır. Resmî Node.js sitesinden <strong>LTS</strong> sürümünü indirin. LTS, uzun süre desteklenen ve yeni başlayanlar için daha güvenli olan sürümdür. Kurulumla birlikte paket yöneticisi <strong>npm</strong> de gelir.</p>

<p>Terminalde kurulumu doğrulayın:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>node <span class="nt">--version</span>
npm <span class="nt">--version</span>
</code></pre></div></div>

<p>Ardından <code class="language-plaintext highlighter-rouge">merhaba.js</code> adlı bir dosya oluşturup şu kodu yazın:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">sayilar</span> <span class="o">=</span> <span class="p">[</span><span class="mi">4</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">15</span><span class="p">,</span> <span class="mi">16</span><span class="p">,</span> <span class="mi">23</span><span class="p">,</span> <span class="mi">42</span><span class="p">];</span>
<span class="kd">const</span> <span class="nx">toplam</span> <span class="o">=</span> <span class="nx">sayilar</span><span class="p">.</span><span class="nf">reduce</span><span class="p">((</span><span class="nx">sonuc</span><span class="p">,</span> <span class="nx">sayi</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="nx">sonuc</span> <span class="o">+</span> <span class="nx">sayi</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>

<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">'</span><span class="s1">Toplam:</span><span class="dl">'</span><span class="p">,</span> <span class="nx">toplam</span><span class="p">);</span>
</code></pre></div></div>

<p>Dosyayı terminalden <code class="language-plaintext highlighter-rouge">node merhaba.js</code> komutuyla çalıştırabilirsiniz. Buradaki toplam işleminin matematiksel gösterimi şöyledir:</p>

\[S = \sum_{i=1}^{n} x_i\]

<h2 id="vs-codeu-hazırlamak">VS Code’u hazırlamak</h2>

<p>VS Code’u kurduktan sonra bir proje klasörü açın. Daha konforlu kod yazmak için şu eklentiler yararlıdır:</p>

<table>
  <thead>
    <tr>
      <th>Eklenti</th>
      <th>Görevi</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>ESLint</td>
      <td>Olası kod hatalarını ve kurallara aykırılıkları gösterir</td>
    </tr>
    <tr>
      <td>Prettier</td>
      <td>Kod biçimini otomatik olarak düzenler</td>
    </tr>
    <tr>
      <td>Live Server</td>
      <td>HTML dosyasını yerel sunucuda açar ve yeniler</td>
    </tr>
    <tr>
      <td>Error Lens</td>
      <td>Hataları editör içinde görünür hâle getirir</td>
    </tr>
  </tbody>
</table>

<p>Prettier kurulduktan sonra ayarlardan <strong>Format On Save</strong> seçeneğini etkinleştirebilirsiniz. Böylece dosyayı her kaydettiğinizde girintiler ve boşluklar otomatik düzeltilir.</p>

<h2 id="canlı-sunucuyla-küçük-proje">Canlı sunucuyla küçük proje</h2>

<p>Proje klasöründe <code class="language-plaintext highlighter-rouge">index.html</code> ve <code class="language-plaintext highlighter-rouge">app.js</code> dosyaları oluşturun. HTML dosyanızın kapanış <code class="language-plaintext highlighter-rouge">body</code> etiketinden önce JavaScript’i bağlayın:</p>

<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;button</span> <span class="na">id=</span><span class="s">"dugme"</span><span class="nt">&gt;</span>Tıkla<span class="nt">&lt;/button&gt;</span>
<span class="nt">&lt;script </span><span class="na">src=</span><span class="s">"app.js"</span><span class="nt">&gt;&lt;/script&gt;</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">app.js</code> içinde düğmeye davranış kazandırın:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">dugme</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nf">querySelector</span><span class="p">(</span><span class="dl">'</span><span class="s1">#dugme</span><span class="dl">'</span><span class="p">);</span>
<span class="kd">let</span> <span class="nx">sayac</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>

<span class="nx">dugme</span><span class="p">.</span><span class="nf">addEventListener</span><span class="p">(</span><span class="dl">'</span><span class="s1">click</span><span class="dl">'</span><span class="p">,</span> <span class="p">()</span> <span class="o">=&gt;</span> <span class="p">{</span>
  <span class="nx">sayac</span> <span class="o">+=</span> <span class="mi">1</span><span class="p">;</span>
  <span class="nx">dugme</span><span class="p">.</span><span class="nx">textContent</span> <span class="o">=</span> <span class="s2">`</span><span class="p">${</span><span class="nx">sayac</span><span class="p">}</span><span class="s2"> kez tıklandı`</span><span class="p">;</span>
<span class="p">});</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">index.html</code> dosyasına sağ tıklayıp <strong>Open with Live Server</strong> seçeneğini kullanın. Sayfa genellikle <code class="language-plaintext highlighter-rouge">localhost:5500</code> adresinde açılır ve kaydettiğiniz değişiklikler otomatik yenilenir. Artık konsol deneylerinden dosya tabanlı projelere geçmeye hazırsınız: tarayıcı arayüzü yönetir, Node.js araçları çalıştırır, VS Code ise tüm ekibi aynı masada buluşturur.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="JavaScript" /><category term="Node.js" /><category term="VS Code" /><summary type="html"><![CDATA[JavaScript öğrenmeye başlamak için devasa bir kurulum sihrine ihtiyacınız yoktur; modern bir tarayıcı bile ilk programınızı çalıştırmaya yeter. Ancak gerçek projeler geliştirmek istediğinizde tarayıcı konsolu, Node.js, VS Code ve canlı sunucu araçlarından oluşan düzenli bir çalışma ortamı kurmak büyük rahatlık sağlar. Gelin JavaScript atölyemizin ışıklarını birlikte açalım.]]></summary></entry><entry><title type="html">JavaScript Olay Dinleyicileri: Arayüzün Nabzını Tutmak</title><link href="https://sonsuzus.github.io/posts/javascript-olay-dinleyicileri-arayuzun-nabzini-tutmak/" rel="alternate" type="text/html" title="JavaScript Olay Dinleyicileri: Arayüzün Nabzını Tutmak" /><published>2026-07-28T00:00:00+00:00</published><updated>2026-07-28T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/javascript-olay-dinleyicileri-arayuzun-nabzini-tutmak</id><content type="html" xml:base="https://sonsuzus.github.io/posts/javascript-olay-dinleyicileri-arayuzun-nabzini-tutmak/"><![CDATA[<p>Bir web sayfası kullanıcıya yalnızca bilgi gösteriyorsa dijital bir afişten pek farklı değildir. Onu gerçek bir arayüze dönüştüren şey; tıklamaları, tuşları, kaydırmaları ve form girişlerini algılayıp uygun tepkiler verebilmesidir. JavaScript’teki olay dinleyicileri, tarayıcı ile kullanıcı arasındaki bu konuşmayı yönetir.</p>

<p>``</p>

<h2 id="olay-dinleyicisi-nedir">Olay dinleyicisi nedir?</h2>

<p>Olay dinleyicisi, belirli bir DOM elemanında belirli bir olay gerçekleştiğinde çalıştırılmak üzere kaydedilen fonksiyondur. Temel yöntem <code class="language-plaintext highlighter-rouge">addEventListener()</code> metodudur:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">buton</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nf">querySelector</span><span class="p">(</span><span class="dl">"</span><span class="s2">#kaydet</span><span class="dl">"</span><span class="p">);</span>

<span class="nx">buton</span><span class="p">.</span><span class="nf">addEventListener</span><span class="p">(</span><span class="dl">"</span><span class="s2">click</span><span class="dl">"</span><span class="p">,</span> <span class="p">()</span> <span class="o">=&gt;</span> <span class="p">{</span>
  <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">Kaydet düğmesine tıklandı!</span><span class="dl">"</span><span class="p">);</span>
<span class="p">});</span>
</code></pre></div></div>

<p>Bu kod sürekli çalışan bir döngüyle butonu kontrol etmez. Tarayıcı, dinleyiciyi kaydeder ve tıklama gerçekleştiğinde geri çağırım fonksiyonunu görev kuyruğuna ekler. Böylece gereksiz işlemci kullanımı önlenir.</p>

<p>Bunu basitçe şu maliyet karşılaştırmasıyla düşünebiliriz. Sürekli kontrol yaklaşımında saniyede $n$ kontrol yapılıyorsa yaklaşık maliyet $O(n)$ olur. Olay tabanlı yaklaşımda ise yalnızca gerçekleşen $k$ olay işlenir ve maliyet $O(k)$ seviyesindedir. Genellikle $k \ll n$ olduğundan olay tabanlı tasarım daha verimlidir.</p>

<table>
  <thead>
    <tr>
      <th>Yaklaşım</th>
      <th>Çalışma biçimi</th>
      <th>Avantajı</th>
      <th>Dezavantajı</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Sürekli kontrol</td>
      <td>Durumu tekrar tekrar sorgular</td>
      <td>Mantığı basittir</td>
      <td>Kaynak tüketebilir</td>
    </tr>
    <tr>
      <td>Olay dinleme</td>
      <td>Olay gerçekleşince çalışır</td>
      <td>Verimli ve ölçeklenebilir</td>
      <td>Olay akışını anlamak gerekir</td>
    </tr>
    <tr>
      <td>HTML içi olay</td>
      <td><code class="language-plaintext highlighter-rouge">onclick</code> niteliği kullanır</td>
      <td>Hızlı prototip sağlar</td>
      <td>HTML ile JavaScript’i karıştırır</td>
    </tr>
  </tbody>
</table>

<h2 id="event-loop-ve-asenkron-tepki">Event loop ve asenkron tepki</h2>

<p>JavaScript çoğunlukla tek bir ana iş parçacığında çalışır. Buna rağmen kullanıcı etkileşimleri, zamanlayıcılar ve ağ istekleri birbirini tamamen kilitlemeden yönetilebilir. Tarayıcı olayları izler; hazır geri çağırımları kuyruğa koyar. Event loop, çağrı yığını boşaldığında sıradaki görevi çalıştırır.</p>

<p>Bir tıklama içinde <code class="language-plaintext highlighter-rouge">fetch()</code> kullanıldığında ağ yanıtı beklenirken arayüzün donmamasının nedeni budur:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">durum</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nf">querySelector</span><span class="p">(</span><span class="dl">"</span><span class="s2">#durum</span><span class="dl">"</span><span class="p">);</span>

<span class="nx">buton</span><span class="p">.</span><span class="nf">addEventListener</span><span class="p">(</span><span class="dl">"</span><span class="s2">click</span><span class="dl">"</span><span class="p">,</span> <span class="k">async </span><span class="p">()</span> <span class="o">=&gt;</span> <span class="p">{</span>
  <span class="nx">durum</span><span class="p">.</span><span class="nx">textContent</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">Kaydediliyor...</span><span class="dl">"</span><span class="p">;</span>
  <span class="nx">buton</span><span class="p">.</span><span class="nx">disabled</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span>

  <span class="k">try</span> <span class="p">{</span>
    <span class="kd">const</span> <span class="nx">yanit</span> <span class="o">=</span> <span class="k">await</span> <span class="nf">fetch</span><span class="p">(</span><span class="dl">"</span><span class="s2">/api/kaydet</span><span class="dl">"</span><span class="p">,</span> <span class="p">{</span> <span class="na">method</span><span class="p">:</span> <span class="dl">"</span><span class="s2">POST</span><span class="dl">"</span> <span class="p">});</span>
    <span class="k">if </span><span class="p">(</span><span class="o">!</span><span class="nx">yanit</span><span class="p">.</span><span class="nx">ok</span><span class="p">)</span> <span class="k">throw</span> <span class="k">new</span> <span class="nc">Error</span><span class="p">(</span><span class="dl">"</span><span class="s2">Sunucu hatası</span><span class="dl">"</span><span class="p">);</span>
    <span class="nx">durum</span><span class="p">.</span><span class="nx">textContent</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">Kayıt tamamlandı.</span><span class="dl">"</span><span class="p">;</span>
  <span class="p">}</span> <span class="k">catch </span><span class="p">(</span><span class="nx">hata</span><span class="p">)</span> <span class="p">{</span>
    <span class="nx">durum</span><span class="p">.</span><span class="nx">textContent</span> <span class="o">=</span> <span class="s2">`İşlem başarısız: </span><span class="p">${</span><span class="nx">hata</span><span class="p">.</span><span class="nx">message</span><span class="p">}</span><span class="s2">`</span><span class="p">;</span>
  <span class="p">}</span> <span class="k">finally</span> <span class="p">{</span>
    <span class="nx">buton</span><span class="p">.</span><span class="nx">disabled</span> <span class="o">=</span> <span class="kc">false</span><span class="p">;</span>
  <span class="p">}</span>
<span class="p">});</span>
</code></pre></div></div>

<p>Burada dinleyici <code class="language-plaintext highlighter-rouge">async</code> olarak tanımlanır. <code class="language-plaintext highlighter-rouge">await</code>, ağ işleminin sonucunu beklerken JavaScript motorunun diğer olayları ele alabilmesine izin verir. Düğmenin geçici olarak devre dışı bırakılması da art arda gönderilen istekleri engeller.</p>

<h2 id="olay-nesnesi-ve-klavye-kontrolü">Olay nesnesi ve klavye kontrolü</h2>

<p>Dinleyiciye aktarılan olay nesnesi, etkileşim hakkında ayrıntılar taşır. Klavye olaylarında basılan tuş <code class="language-plaintext highlighter-rouge">event.key</code>, tıklamalarda hedef eleman ise <code class="language-plaintext highlighter-rouge">event.target</code> üzerinden okunabilir:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">arama</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nf">querySelector</span><span class="p">(</span><span class="dl">"</span><span class="s2">#arama</span><span class="dl">"</span><span class="p">);</span>

<span class="nx">arama</span><span class="p">.</span><span class="nf">addEventListener</span><span class="p">(</span><span class="dl">"</span><span class="s2">keydown</span><span class="dl">"</span><span class="p">,</span> <span class="p">(</span><span class="nx">event</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="p">{</span>
  <span class="k">if </span><span class="p">(</span><span class="nx">event</span><span class="p">.</span><span class="nx">key</span> <span class="o">===</span> <span class="dl">"</span><span class="s2">Enter</span><span class="dl">"</span><span class="p">)</span> <span class="p">{</span>
    <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">Aranan ifade:</span><span class="dl">"</span><span class="p">,</span> <span class="nx">event</span><span class="p">.</span><span class="nx">target</span><span class="p">.</span><span class="nx">value</span><span class="p">);</span>
  <span class="p">}</span>
<span class="p">});</span>
</code></pre></div></div>

<p>Klavye desteği erişilebilirlik açısından kritiktir. Yalnızca fare tıklamasına göre tasarlanan bir arayüz, klavye veya yardımcı teknoloji kullanan kişileri dışarıda bırakabilir.</p>

<h2 id="yayılma-ve-olay-delegasyonu">Yayılma ve olay delegasyonu</h2>

<p>Bir olay hedef elemanda doğar ve varsayılan olarak üst elemanlara doğru yayılır; buna <strong>bubbling</strong> denir. Bu davranış, olay delegasyonu için kullanılabilir. Yüzlerce liste öğesine ayrı dinleyici eklemek yerine üst kapsayıcı dinlenir:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">liste</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nf">querySelector</span><span class="p">(</span><span class="dl">"</span><span class="s2">#gorevler</span><span class="dl">"</span><span class="p">);</span>

<span class="nx">liste</span><span class="p">.</span><span class="nf">addEventListener</span><span class="p">(</span><span class="dl">"</span><span class="s2">click</span><span class="dl">"</span><span class="p">,</span> <span class="p">(</span><span class="nx">event</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="p">{</span>
  <span class="kd">const</span> <span class="nx">silButonu</span> <span class="o">=</span> <span class="nx">event</span><span class="p">.</span><span class="nx">target</span><span class="p">.</span><span class="nf">closest</span><span class="p">(</span><span class="dl">"</span><span class="s2">.sil</span><span class="dl">"</span><span class="p">);</span>
  <span class="k">if </span><span class="p">(</span><span class="o">!</span><span class="nx">silButonu</span><span class="p">)</span> <span class="k">return</span><span class="p">;</span>

  <span class="nx">silButonu</span><span class="p">.</span><span class="nf">closest</span><span class="p">(</span><span class="dl">"</span><span class="s2">li</span><span class="dl">"</span><span class="p">).</span><span class="nf">remove</span><span class="p">();</span>
<span class="p">});</span>
</code></pre></div></div>

<p>Bu yöntem sonradan eklenen öğelerde de çalışır ve dinleyici sayısını azaltır. Gerekirse <code class="language-plaintext highlighter-rouge">event.stopPropagation()</code> yayılmayı durdurur; ancak gelişigüzel kullanılması başka bileşenlerin olayları görememesine yol açabilir.</p>

<p>Son olarak, artık gerekmeyen dinleyiciler <code class="language-plaintext highlighter-rouge">removeEventListener()</code> ile kaldırılmalıdır. Özellikle tek sayfa uygulamalarında temizlik yapılmaması bellek sızıntılarına ve aynı tepkinin birden fazla çalışmasına neden olabilir. İyi tasarlanmış olay yönetimi; hızlı, erişilebilir ve kullanıcıya gerçekten cevap veren arayüzlerin görünmez kahramanıdır.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="JavaScript" /><category term="Event Listeners" /><category term="Asenkron Programlama" /><summary type="html"><![CDATA[Bir web sayfası kullanıcıya yalnızca bilgi gösteriyorsa dijital bir afişten pek farklı değildir. Onu gerçek bir arayüze dönüştüren şey; tıklamaları, tuşları, kaydırmaları ve form girişlerini algılayıp uygun tepkiler verebilmesidir. JavaScript’teki olay dinleyicileri, tarayıcı ile kullanıcı arasındaki bu konuşmayı yönetir.]]></summary></entry><entry><title type="html">JavaScript Promise’ları ile Asenkron Karmaşayı Yönetmek</title><link href="https://sonsuzus.github.io/posts/javascript-promiselari-ile-asenkron-karmasayi-yonetmek/" rel="alternate" type="text/html" title="JavaScript Promise’ları ile Asenkron Karmaşayı Yönetmek" /><published>2026-07-28T00:00:00+00:00</published><updated>2026-07-28T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/javascript-promiselari-ile-asenkron-karmasayi-yonetmek</id><content type="html" xml:base="https://sonsuzus.github.io/posts/javascript-promiselari-ile-asenkron-karmasayi-yonetmek/"><![CDATA[<p>Bir API isteğinin ne zaman tamamlanacağını, dosyanın ne zaman okunacağını veya kullanıcının konum bilgisinin ne zaman geleceğini önceden bilemeyiz. JavaScript bu bekleme süresinde uygulamayı durdurmak yerine diğer işleri yürütür. Ancak sonuçları callback fonksiyonlarıyla takip etmeye çalışmak, kısa sürede girintilerle dolu bir “callback cehennemine” dönüşebilir. Promise nesneleri, gelecekte tamamlanacak işlemleri düzenli, zincirlenebilir ve güvenilir biçimde temsil ederek bu karmaşaya çözüm sunar.</p>

<p>``</p>

<h2 id="promise-nedir">Promise nedir?</h2>

<p>Promise, henüz elimizde olmayan fakat gelecekte elde edilmesi beklenen bir değerin temsilcisidir. Gerçek hayatta restorandan aldığımız sipariş fişine benzetilebilir: Yemek henüz hazır değildir, ancak fiş işlemin başarılı şekilde tamamlanacağını veya bir sorun oluşacağını takip etmemizi sağlar.</p>

<p>Bir Promise üç durumdan birinde bulunur:</p>

<table>
  <thead>
    <tr>
      <th>Durum</th>
      <th>Anlamı</th>
      <th>Sonraki adım</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">pending</code></td>
      <td>İşlem devam ediyor</td>
      <td>Beklenir</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">fulfilled</code></td>
      <td>İşlem başarıyla tamamlandı</td>
      <td>Değer kullanılır</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">rejected</code></td>
      <td>İşlem başarısız oldu</td>
      <td>Hata işlenir</td>
    </tr>
  </tbody>
</table>

<p>Bir Promise yalnızca bir kez sonuçlanır. <code class="language-plaintext highlighter-rouge">fulfilled</code> veya <code class="language-plaintext highlighter-rouge">rejected</code> durumuna geçtikten sonra tekrar değiştirilemez. Durum geçişini matematiksel olarak $pending \rightarrow fulfilled$ veya $pending \rightarrow rejected$ biçiminde gösterebiliriz. Ancak $fulfilled \rightarrow pending$ gibi bir geri dönüş mümkün değildir.</p>

<h2 id="i̇lk-promiseimizi-oluşturalım">İlk Promise’imizi oluşturalım</h2>

<p>Promise kurucusu, <code class="language-plaintext highlighter-rouge">resolve</code> ve <code class="language-plaintext highlighter-rouge">reject</code> fonksiyonlarını alan bir yürütücü fonksiyon bekler:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">function</span> <span class="nf">siparisHazirla</span><span class="p">(</span><span class="nx">stokVarMi</span><span class="p">)</span> <span class="p">{</span>
  <span class="k">return</span> <span class="k">new</span> <span class="nc">Promise</span><span class="p">((</span><span class="nx">resolve</span><span class="p">,</span> <span class="nx">reject</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="p">{</span>
    <span class="nf">setTimeout</span><span class="p">(()</span> <span class="o">=&gt;</span> <span class="p">{</span>
      <span class="k">if </span><span class="p">(</span><span class="nx">stokVarMi</span><span class="p">)</span> <span class="p">{</span>
        <span class="nf">resolve</span><span class="p">({</span> <span class="na">urun</span><span class="p">:</span> <span class="dl">"</span><span class="s2">Kahve</span><span class="dl">"</span><span class="p">,</span> <span class="na">durum</span><span class="p">:</span> <span class="dl">"</span><span class="s2">Hazır</span><span class="dl">"</span> <span class="p">});</span>
      <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
        <span class="nf">reject</span><span class="p">(</span><span class="k">new</span> <span class="nc">Error</span><span class="p">(</span><span class="dl">"</span><span class="s2">Kahve çekirdeği kalmadı!</span><span class="dl">"</span><span class="p">));</span>
      <span class="p">}</span>
    <span class="p">},</span> <span class="mi">1000</span><span class="p">);</span>
  <span class="p">});</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Burada <code class="language-plaintext highlighter-rouge">setTimeout</code>, bir saniye süren asenkron işlemi taklit eder. İşlem başarılıysa <code class="language-plaintext highlighter-rouge">resolve</code> sonuç değerini iletir; başarısızsa <code class="language-plaintext highlighter-rouge">reject</code> bir hata üretir. Gerçek projelerde aynı yapı ağ istekleri, veritabanı sorguları veya dosya işlemleri için kullanılabilir.</p>

<p>Promise sonucunu <code class="language-plaintext highlighter-rouge">then</code>, <code class="language-plaintext highlighter-rouge">catch</code> ve <code class="language-plaintext highlighter-rouge">finally</code> metotlarıyla yönetebiliriz:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nf">siparisHazirla</span><span class="p">(</span><span class="kc">true</span><span class="p">)</span>
  <span class="p">.</span><span class="nf">then</span><span class="p">((</span><span class="nx">siparis</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="p">{</span>
    <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">siparis</span><span class="p">.</span><span class="nx">durum</span><span class="p">);</span>
    <span class="k">return</span> <span class="s2">`</span><span class="p">${</span><span class="nx">siparis</span><span class="p">.</span><span class="nx">urun</span><span class="p">}</span><span class="s2"> müşteriye götürülüyor`</span><span class="p">;</span>
  <span class="p">})</span>
  <span class="p">.</span><span class="nf">then</span><span class="p">((</span><span class="nx">mesaj</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">mesaj</span><span class="p">))</span>
  <span class="p">.</span><span class="k">catch</span><span class="p">((</span><span class="nx">hata</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="nx">console</span><span class="p">.</span><span class="nf">error</span><span class="p">(</span><span class="nx">hata</span><span class="p">.</span><span class="nx">message</span><span class="p">))</span>
  <span class="p">.</span><span class="k">finally</span><span class="p">(()</span> <span class="o">=&gt;</span> <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">Sipariş işlemi sona erdi</span><span class="dl">"</span><span class="p">));</span>
</code></pre></div></div>

<p>Her <code class="language-plaintext highlighter-rouge">then</code> yeni bir Promise döndürür. Böylece sonuçlar sırayla aktarılır ve iç içe callback’ler yerine düz bir zincir kurulur. Zincirin herhangi bir noktasında hata oluşursa kontrol en yakın <code class="language-plaintext highlighter-rouge">catch</code> bloğuna gider. <code class="language-plaintext highlighter-rouge">finally</code> ise sonuç ne olursa olsun çalışır; yükleniyor göstergesini kapatmak gibi temizlik işleri için idealdir.</p>

<h2 id="callback-ve-promise-karşılaştırması">Callback ve Promise karşılaştırması</h2>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>Callback yaklaşımı</th>
      <th>Promise yaklaşımı</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Okunabilirlik</td>
      <td>İç içe yapılar oluşabilir</td>
      <td>Doğrusal zincir kurulur</td>
    </tr>
    <tr>
      <td>Hata yönetimi</td>
      <td>Her seviyede ayrı kontrol gerekebilir</td>
      <td>Tek <code class="language-plaintext highlighter-rouge">catch</code> zinciri yakalayabilir</td>
    </tr>
    <tr>
      <td>Birleştirme</td>
      <td>Elle koordinasyon gerekir</td>
      <td>Hazır yardımcı metotlar vardır</td>
    </tr>
    <tr>
      <td>Sonuç aktarımı</td>
      <td>Parametrelerle yapılır</td>
      <td><code class="language-plaintext highlighter-rouge">return</code> ile zincire iletilir</td>
    </tr>
  </tbody>
</table>

<h2 id="birden-fazla-işlemi-yönetmek">Birden fazla işlemi yönetmek</h2>

<p>Bağımsız görevleri paralel başlatmak için <code class="language-plaintext highlighter-rouge">Promise.all</code> kullanılabilir:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">profil</span> <span class="o">=</span> <span class="nf">fetch</span><span class="p">(</span><span class="dl">"</span><span class="s2">/api/profil</span><span class="dl">"</span><span class="p">);</span>
<span class="kd">const</span> <span class="nx">bildirimler</span> <span class="o">=</span> <span class="nf">fetch</span><span class="p">(</span><span class="dl">"</span><span class="s2">/api/bildirimler</span><span class="dl">"</span><span class="p">);</span>

<span class="nb">Promise</span><span class="p">.</span><span class="nf">all</span><span class="p">([</span><span class="nx">profil</span><span class="p">,</span> <span class="nx">bildirimler</span><span class="p">])</span>
  <span class="p">.</span><span class="nf">then</span><span class="p">(([</span><span class="nx">profilYaniti</span><span class="p">,</span> <span class="nx">bildirimYaniti</span><span class="p">])</span> <span class="o">=&gt;</span> <span class="p">{</span>
    <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">İki istek de tamamlandı</span><span class="dl">"</span><span class="p">);</span>
  <span class="p">})</span>
  <span class="p">.</span><span class="k">catch</span><span class="p">((</span><span class="nx">hata</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="nx">console</span><span class="p">.</span><span class="nf">error</span><span class="p">(</span><span class="dl">"</span><span class="s2">İsteklerden biri başarısız</span><span class="dl">"</span><span class="p">,</span> <span class="nx">hata</span><span class="p">));</span>
</code></pre></div></div>

<p>İşlemlerin süreleri $t_1$ ve $t_2$ ise paralel toplam süre yaklaşık $T = \max(t_1, t_2)$ olur. Sıralı çalıştırmada ise süre yaklaşık $T = t_1 + t_2$ olacaktır. Bununla birlikte <code class="language-plaintext highlighter-rouge">Promise.all</code>, tek bir işlem reddedildiğinde hemen reddedilir. Bütün sonuçları başarı veya hata ayrımıyla görmek için <code class="language-plaintext highlighter-rouge">Promise.allSettled</code>; ilk tamamlanan sonucu almak için <code class="language-plaintext highlighter-rouge">Promise.race</code>; ilk başarılı sonucu almak için <code class="language-plaintext highlighter-rouge">Promise.any</code> tercih edilebilir.</p>

<p>Promise’lar işlemleri sihirli biçimde hızlandırmaz; asıl güçleri zamanlamayı ve hata akışını düzenlemeleridir. Modern <code class="language-plaintext highlighter-rouge">async/await</code> sözdizimi de temelde Promise’lar üzerinde çalışır. Bu nedenle Promise mantığını öğrenmek, yalnızca eski callback zincirlerinden kurtulmayı değil, JavaScript’in modern asenkron dünyasını sağlam bir temelle anlamayı sağlar.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="JavaScript" /><category term="Promise" /><category term="Asenkron Programlama" /><summary type="html"><![CDATA[Bir API isteğinin ne zaman tamamlanacağını, dosyanın ne zaman okunacağını veya kullanıcının konum bilgisinin ne zaman geleceğini önceden bilemeyiz. JavaScript bu bekleme süresinde uygulamayı durdurmak yerine diğer işleri yürütür. Ancak sonuçları callback fonksiyonlarıyla takip etmeye çalışmak, kısa sürede girintilerle dolu bir “callback cehennemine” dönüşebilir. Promise nesneleri, gelecekte tamamlanacak işlemleri düzenli, zincirlenebilir ve güvenilir biçimde temsil ederek bu karmaşaya çözüm sunar.]]></summary></entry><entry><title type="html">JavaScript Prototipleri: Nesnelerin Birbirinden Miras Aldığı Dünya</title><link href="https://sonsuzus.github.io/posts/javascript-prototipleri-nesnelerin-birbirinden-miras-aldigi-dunya/" rel="alternate" type="text/html" title="JavaScript Prototipleri: Nesnelerin Birbirinden Miras Aldığı Dünya" /><published>2026-07-28T00:00:00+00:00</published><updated>2026-07-28T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/javascript-prototipleri-nesnelerin-birbirinden-miras-aldigi-dunya</id><content type="html" xml:base="https://sonsuzus.github.io/posts/javascript-prototipleri-nesnelerin-birbirinden-miras-aldigi-dunya/"><![CDATA[<p>JavaScript’te bir nesne kayıp bir özelliğini nerede arar? Cevap, klasik sınıf tabanlı dillerden biraz farklıdır: başka bir nesnede! JavaScript’in prototip tabanlı kalıtım sistemi, nesnelerin davranış ve özellikleri doğrudan diğer nesnelerden devralmasını sağlar. İlk bakışta gizemli görünen bu mekanizma; nesne metotlarından <code class="language-plaintext highlighter-rouge">class</code> sözdizimine kadar dilin önemli bir bölümünün perde arkasında çalışır.
``</p>
<h2 id="prototip-nedir">Prototip nedir?</h2>

<p>Her sıradan JavaScript nesnesi, başka bir nesneye işaret eden dahili bir <code class="language-plaintext highlighter-rouge">[[Prototype]]</code> bağlantısına sahip olabilir. Bir özelliğe erişildiğinde JavaScript önce nesnenin kendi özelliklerine bakar. Özellik bulunamazsa prototipe, orada da bulunamazsa prototipin prototipine geçer. Bu yolculuk <code class="language-plaintext highlighter-rouge">null</code> değerine ulaşınca sona erer.</p>

<p>Bu bağlantılı yapı <strong>prototip zinciri</strong> olarak adlandırılır. Arama sürecini basitleştirerek şöyle gösterebiliriz:</p>

\[nesne \rightarrow prototip_1 \rightarrow prototip_2 \rightarrow null\]

<p>Zincirin uzunluğu $n$ ise en kötü durumdaki özellik arama maliyeti yaklaşık $O(n)$ olur. Modern JavaScript motorları çeşitli optimizasyonlar uygulasa da gereksiz derecede uzun zincirler tasarlamak iyi bir fikir değildir.</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">canli</span> <span class="o">=</span> <span class="p">{</span>
  <span class="nf">nefesAl</span><span class="p">()</span> <span class="p">{</span>
    <span class="k">return</span> <span class="dl">"</span><span class="s2">Nefes alındı!</span><span class="dl">"</span><span class="p">;</span>
  <span class="p">}</span>
<span class="p">};</span>

<span class="kd">const</span> <span class="nx">kedi</span> <span class="o">=</span> <span class="nb">Object</span><span class="p">.</span><span class="nf">create</span><span class="p">(</span><span class="nx">canli</span><span class="p">);</span>
<span class="nx">kedi</span><span class="p">.</span><span class="nx">isim</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">Tekir</span><span class="dl">"</span><span class="p">;</span>
<span class="nx">kedi</span><span class="p">.</span><span class="nx">miyavla</span> <span class="o">=</span> <span class="nf">function </span><span class="p">()</span> <span class="p">{</span>
  <span class="k">return</span> <span class="dl">"</span><span class="s2">Miyav!</span><span class="dl">"</span><span class="p">;</span>
<span class="p">};</span>

<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">kedi</span><span class="p">.</span><span class="nx">isim</span><span class="p">);</span>       <span class="c1">// Kendi özelliği: Tekir</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">kedi</span><span class="p">.</span><span class="nf">nefesAl</span><span class="p">());</span>  <span class="c1">// Prototipten gelir</span>
</code></pre></div></div>

<p>Burada <code class="language-plaintext highlighter-rouge">Object.create(canli)</code>, prototipi <code class="language-plaintext highlighter-rouge">canli</code> olan yeni bir nesne üretir. <code class="language-plaintext highlighter-rouge">kedi</code> içinde <code class="language-plaintext highlighter-rouge">nefesAl</code> bulunmadığı için motor, aramaya <code class="language-plaintext highlighter-rouge">canli</code> nesnesinde devam eder.</p>

<h2 id="sınıf-tabanlı-ve-prototip-tabanlı-yaklaşım">Sınıf tabanlı ve prototip tabanlı yaklaşım</h2>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>Sınıf tabanlı model</th>
      <th>JavaScript prototip modeli</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Temel yapı</td>
      <td>Sınıf</td>
      <td>Nesne</td>
    </tr>
    <tr>
      <td>Kalıtım</td>
      <td>Sınıftan sınıfa</td>
      <td>Nesneden nesneye</td>
    </tr>
    <tr>
      <td>Örnek üretimi</td>
      <td>Sınıf örneklenir</td>
      <td>Nesne oluşturulur ve prototipe bağlanır</td>
    </tr>
    <tr>
      <td>Davranış paylaşımı</td>
      <td>Üst sınıf metotları</td>
      <td>Prototip zincirindeki metotlar</td>
    </tr>
    <tr>
      <td>Değişiklik esnekliği</td>
      <td>Genellikle daha katı</td>
      <td>Çalışma zamanında oldukça dinamik</td>
    </tr>
  </tbody>
</table>

<p>JavaScript’teki <code class="language-plaintext highlighter-rouge">class</code> sözdizimi bu modeli ortadan kaldırmaz. Yalnızca prototip mekanizmasını daha tanıdık ve okunabilir biçimde kullanmamızı sağlayan bir sözdizimsel kolaylıktır.</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">class</span> <span class="nc">Hayvan</span> <span class="p">{</span>
  <span class="nf">constructor</span><span class="p">(</span><span class="nx">isim</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">this</span><span class="p">.</span><span class="nx">isim</span> <span class="o">=</span> <span class="nx">isim</span><span class="p">;</span>
  <span class="p">}</span>

  <span class="nf">tanit</span><span class="p">()</span> <span class="p">{</span>
    <span class="k">return</span> <span class="s2">`Ben </span><span class="p">${</span><span class="k">this</span><span class="p">.</span><span class="nx">isim</span><span class="p">}</span><span class="s2">`</span><span class="p">;</span>
  <span class="p">}</span>
<span class="p">}</span>

<span class="kd">class</span> <span class="nc">Kopek</span> <span class="kd">extends</span> <span class="nc">Hayvan</span> <span class="p">{</span>
  <span class="nf">havla</span><span class="p">()</span> <span class="p">{</span>
    <span class="k">return</span> <span class="dl">"</span><span class="s2">Hav hav!</span><span class="dl">"</span><span class="p">;</span>
  <span class="p">}</span>
<span class="p">}</span>

<span class="kd">const</span> <span class="nx">karabas</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">Kopek</span><span class="p">(</span><span class="dl">"</span><span class="s2">Karabaş</span><span class="dl">"</span><span class="p">);</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">karabas</span><span class="p">.</span><span class="nf">tanit</span><span class="p">());</span>
</code></pre></div></div>

<p>Bu örnekte <code class="language-plaintext highlighter-rouge">tanit</code>, her nesneye ayrı ayrı kopyalanmaz. Metot <code class="language-plaintext highlighter-rouge">Hayvan.prototype</code> üzerinde tutulur ve örnekler tarafından paylaşılır. Kabaca bellek kullanımı, metodu her örneğe kopyalayan bir yaklaşımda $n \times m$ iken prototip paylaşımında $m + n \times r$ biçiminde düşünülebilir. Burada $m$ metot boyutunu, $r$ ise her örneğin kendi verisini temsil eder.</p>

<h2 id="prototype-ile-prototype-aynı-şey-mi"><code class="language-plaintext highlighter-rouge">prototype</code> ile <code class="language-plaintext highlighter-rouge">[[Prototype]]</code> aynı şey mi?</h2>

<p>Hayır; isim benzerliği sıkça kafa karıştırır. Fonksiyonların <code class="language-plaintext highlighter-rouge">prototype</code> özelliği, o fonksiyon <code class="language-plaintext highlighter-rouge">new</code> ile çağrıldığında oluşturulacak nesnelerin prototipini belirler. <code class="language-plaintext highlighter-rouge">[[Prototype]]</code> ise bir nesnenin başka bir nesneye olan dahili bağlantısıdır.</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">function</span> <span class="nf">Kullanici</span><span class="p">(</span><span class="nx">ad</span><span class="p">)</span> <span class="p">{</span>
  <span class="k">this</span><span class="p">.</span><span class="nx">ad</span> <span class="o">=</span> <span class="nx">ad</span><span class="p">;</span>
<span class="p">}</span>

<span class="nx">Kullanici</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">selamla</span> <span class="o">=</span> <span class="nf">function </span><span class="p">()</span> <span class="p">{</span>
  <span class="k">return</span> <span class="s2">`Merhaba, ben </span><span class="p">${</span><span class="k">this</span><span class="p">.</span><span class="nx">ad</span><span class="p">}</span><span class="s2">`</span><span class="p">;</span>
<span class="p">};</span>

<span class="kd">const</span> <span class="nx">ada</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">Kullanici</span><span class="p">(</span><span class="dl">"</span><span class="s2">Ada</span><span class="dl">"</span><span class="p">);</span>

<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nb">Object</span><span class="p">.</span><span class="nf">getPrototypeOf</span><span class="p">(</span><span class="nx">ada</span><span class="p">)</span> <span class="o">===</span> <span class="nx">Kullanici</span><span class="p">.</span><span class="nx">prototype</span><span class="p">);</span> <span class="c1">// true</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">ada</span><span class="p">.</span><span class="nf">hasOwnProperty</span><span class="p">(</span><span class="dl">"</span><span class="s2">ad</span><span class="dl">"</span><span class="p">));</span>       <span class="c1">// true</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">ada</span><span class="p">.</span><span class="nf">hasOwnProperty</span><span class="p">(</span><span class="dl">"</span><span class="s2">selamla</span><span class="dl">"</span><span class="p">));</span> <span class="c1">// false</span>
</code></pre></div></div>

<p>Prototipi incelemek için standart <code class="language-plaintext highlighter-rouge">Object.getPrototypeOf()</code> kullanılmalıdır. Tarihsel <code class="language-plaintext highlighter-rouge">__proto__</code> erişimi yaygın görünse de yeni kodlarda önerilmez.</p>

<h2 id="sağlam-kullanım-için-ipuçları">Sağlam kullanım için ipuçları</h2>

<p>Bir özelliğin doğrudan nesneye ait olup olmadığını kontrol etmek için <code class="language-plaintext highlighter-rouge">Object.hasOwn(nesne, "özellik")</code> tercih edilebilir. <code class="language-plaintext highlighter-rouge">for...in</code> döngüsünün prototipten gelen numaralandırılabilir özellikleri de dolaşabileceği unutulmamalıdır. Ayrıca yerleşik prototiplere, örneğin <code class="language-plaintext highlighter-rouge">Array.prototype</code> üzerine rastgele metot eklemek çakışmalara ve zor bulunan hatalara yol açabilir.</p>

<p>Özetle JavaScript kalıtımı, görünmez sınıf şablonlarından çok birbirine bağlanan nesneler üzerine kuruludur. Prototip zincirini anladığınızda <code class="language-plaintext highlighter-rouge">new</code>, <code class="language-plaintext highlighter-rouge">class</code>, <code class="language-plaintext highlighter-rouge">extends</code> ve metot paylaşımı sihir olmaktan çıkar; hepsi aynı mekanizmanın farklı yüzleri hâline gelir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="JavaScript" /><category term="Prototipler" /><category term="Kalıtım" /><summary type="html"><![CDATA[JavaScript’te bir nesne kayıp bir özelliğini nerede arar? Cevap, klasik sınıf tabanlı dillerden biraz farklıdır: başka bir nesnede! JavaScript’in prototip tabanlı kalıtım sistemi, nesnelerin davranış ve özellikleri doğrudan diğer nesnelerden devralmasını sağlar. İlk bakışta gizemli görünen bu mekanizma; nesne metotlarından class sözdizimine kadar dilin önemli bir bölümünün perde arkasında çalışır.]]></summary></entry></feed>