CodeBlanks Logo Icon CodeBlanks

Decorator nedir?

Sınıf decorator'larının ne olduğunu öğrenirsin.

Decorator nedir?

Decorator, bir sınıfı, metodu veya özelliği işaretleyip değiştiren fonksiyondur. Sınıf decorator'u, sınıf bildirisinin hemen üstünde @Ad biçiminde yazılır ve constructor fonksiyonunu alır. Dönen değer (varsa) sınıfın yerine geçer.

@Logged
class Foo {
  selam() { return "merhaba"; }
}

Decorator higher-order fonksiyondur

Decorator, temelde bir higher-order fonksiyondur. @Logged class Foo {} yazımı, Foo sınıfını Logged fonksiyonuna geçirmeye eşdeğerdir. Decorator, constructor'ı alır ve onu olduğu gibi veya değiştirilmiş halde döndürür.

// @Logged class Foo {} eşdeğeri:
const Foo = Logged(class Foo {
  selam() { return "merhaba"; }
});

Uygulama Sınıf decorator'u yaz

Logged adında bir sınıf decorator'u yaz: ctor parametresi alsın, console.log ile "sınıf hazır" yazdırsın ve ctor'yu geri döndürsün. Foo sınıfını tanımla; selam metodu "merhaba" döndürsün. LoggedFoo değişkenine Logged'u Foo ile çağırarak decorator'u elle uygula. Elde edilen sınıfın yeni bir örneğinin selam metodunu çağır ve sonucu console.log ile yazdır.

Başlangıç kodu

index.ts
// Logged fonksiyonunu yaz: ctor parametresi alsın
// "sınıf hazır" yazdır, ctor'yu döndür
// Foo sınıfını tanımla, selam metodu "merhaba" döndürsün
// LoggedFoo değişkenini Foo sınıfını Logged ile işleyerek oluştur
// yeni örnek üzerinden selam metodunu çağır, sonucu yazdır

Örnek çözüm

index.ts
function Logged(ctor: any): any {
  console.log("sınıf hazır");
  return ctor;
}

class Foo {
  selam(): string {
    return "merhaba";
  }
}

const LoggedFoo = Logged(Foo);
console.log(new LoggedFoo().selam());

Beklenen çıktı

sınıf hazır
merhaba

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Bir sınıf decorator'u kaç argüman alır ve bu argüman nedir?

  • Constructor fonksiyonu (1 argüman) Doğru cevap
  • Sınıfın bir örneği (1 argüman)
  • Metot descriptor nesnesi (1 argüman)
  • Özellik adı (1 argüman)

Açıklama: Sınıf decorator'u tek argüman alır: sınıfın constructor fonksiyonu. Örnek, metot descriptor'u ve özellik adı diğer decorator türlerinin argümanlarıdır.

2 Constructor'ı döndür

Soru
function Logged(ctor: any): any {
  console.log("sınıf hazır");
  return ____;
}
Cevap
function Logged(ctor: any): any {
  console.log("sınıf hazır");
  return ctor;
}

Açıklama: Sınıf decorator'u, aldığı constructor'ı geri döndürmelidir. this bir fonksiyon içinde constructor'a eşit değildir; null sınıfı kaybeder; new ctor() bir örnek döndürür, constructor'u değil.

3 Sınıf decorator parçaları

Kavram Anlamı
@Logged Decorator işareti ve adı
class Foo İşaretlenen sınıf
function Logged(ctor) Decorator fonksiyon tanımı
return ctor Constructor'ı geri döndürme

Orta seviye bölümündeki tüm dersler