JavaScript
Metaprogramlama nedir?
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
-
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.
-
Aracı amacına bağla
- Reflect.has
- Özellik var mı
- Object.keys
- Özellik adlarını diz
- typeof
- Değerin tipi
- Proxy
- Davranışı sarma
-
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);
Sıradaki ders: Proxy ile doğrulama