CodeBlanks Logo Icon CodeBlanks

Metaprogramlama nedir?

JavaScript kursu · Uzman · Ders 36/63

Kodun başka kodu nasıl yönettiğini ve yansıma (reflection) kavramını öğrenirsin.

Metaprogramlama nedir?

Metaprogramlama, kodun başka kodu yönettiği veya kendini incelediği bir programlama biçimidir. Normalde sen kodu yazarsın ve çalışır; metaprogramlamada kod, çalışma sırasında başka bir kodun yapısını okur ya da davranışını değiştirir.

Buna sıkça yansıma (reflection) denir: program kendi özelliklerini, tiplerini ve metotlarını öğrenir. JavaScript'te typeof, Object.keys, Reflect, Proxy ve Symbol bunun için kullanılan araçlardır.

Bu grupta kodu denetleyen, doğrulayan ve saran teknikleri öğreneceksin.

Yansıma araçları

Yansıma (reflection), bir programın kendi yapısını okumasıdır: hangi özellikleri var, hangi tipten, hangi metotlar tanımlı? JavaScript bunu birkaç araçla sağlar.

typeof bir değerin tipini verir, Object.keys bir nesnenin özellik adlarını dizer, instanceof prototype zincirini sorgular. Reflect API ise bu işleri tek bir tutarlı arayüzde toplar: Reflect.has, Reflect.get, Reflect.ownKeys.

Yansıma yalnızca okur; davranışı değiştirmez. Davranışı değiştirmek Proxy ile başlar.

Uygulama Bir nesneyi incele

describe(obj) adında bir fonksiyon tanımla. İçinde Object.keys(obj) ile özellik adlarını bir değişkene al ve console.log ile yazdır. Sonra Reflect.has(obj, 'name') ile 'name' özelliğinin varlığını kontrol edip sonucu yazdır. En son describe({ name: 'Ayşe', age: 28 }) çağrısı yap.

Örnek çözümü göster
function describe(obj) {
  const keys = Object.keys(obj);
  console.log(keys);
  console.log(Reflect.has(obj, 'name'));
}
describe({ name: 'Ayşe', age: 28 });

Kendini test et

  1. Hangisi metaprogramlama örneğidir?

    const handler = { set(t,p,v){ if(p==='age' && v<0) throw new TypeError(); t[p]=v; return true; } };
    • Bir Proxy ile atamayı doğrulayıp engellemek
    • Bir dizi içindeki sayıları toplamak
    • Bir dizeden ilk üç karakteri almak
    • Bir metni büyük harfe çevirmek
    Cevabı göster

    Bir Proxy ile atamayı doğrulayıp engellemek — Doğru! Proxy ile atamayı doğrulayan bir kod, başka kodun davranışını yönetir; bu yüzden metaprogramlamadır.

  2. Aracı amacına bağla

    Reflect.has
    Özellik var mı
    Object.keys
    Özellik adlarını diz
    typeof
    Değerin tipi
    Proxy
    Davranışı sarma
  3. Reflect ile özellik kontrolü

    const user = { name: 'Ayşe' };
    const exists = ____;
    console.log(exists);
    Cevabı göster
    const user = { name: 'Ayşe' };
    const exists = Reflect.has(user, 'name');
    console.log(exists);

Uzman bölümündeki tüm dersler