Məzmuna keç
Educora
İrəli18 dəq13 / 27

Siniflər və varislik

Eyni quruluşlu obyektləri siniflərlə yarat: konstruktor, metodlar, `extends` ilə varislik, gizli sahələr, getter-lər və statik metodlar.

Özünü yoxla
Bu dərsdə öyrənəcəksən
  • constructor və metodları olan sinif yazıb new ilə nüsxələr yaratmaq
  • extends və super ilə sinfi genişləndirmək və metodu yenidən təyin etmək
  • # gizli sahələrindən, getter/setter-lərdən və static metodlardan istifadə etmək

Bankın minlərlə müştərisi var və hər hesabın eyni quruluşu olur: sahibi, balansı, pul qoymaq və çıxarmaq əməliyyatları. Hər hesab üçün obyekti əl ilə yazmaq həm uzun çəkir, həm də asanlıqla səhvə yol açır. Sinif (class) obyektlər üçün çertyojdur: quruluşu bir dəfə təsvir edirsən, sonra ondan istədiyin qədər obyekt yaradırsan.

Sinif, konstruktor və metodlar

Sinif class açar sözü ilə elan olunur və adı böyük hərflə yazılır. Xüsusi constructor metodu hər yeni obyekt yaradılanda avtomatik çağırılır və onun xassələrini təyin edir. this yaradılan konkret obyekti göstərir. Obyekt new operatoru ilə yaradılır; sinifdən yaradılmış obyektə nüsxə (instance) deyilir.

JavaScript
class BankAccount {
  constructor(owner, balance = 0) {
    this.owner = owner;
    this.balance = balance;
  }

  deposit(amount) {
    this.balance += amount;
    return this.balance;
  }

  describe() {
    return `${this.owner}: ${this.balance} AZN`;
  }
}

const aysel = new BankAccount('Aysel', 100);
const murad = new BankAccount('Murad');

aysel.deposit(50);
console.log(aysel.describe());
console.log(murad.describe());
console.log(aysel instanceof BankAccount);
▸ Gözlənilən nəticə
Aysel: 150 AZN
Murad: 0 AZN
true
İki nüsxənin metodları ortaqdır, verilənləri isə ayrı-ayrıdır: Ayselin hesabı ilə edilən əməliyyat Muradın balansına təsir etmir.

Varislik: extends və super

Əmanət hesabı adi hesabın bacardığı hər şeyi bacarır, üstəlik faiz də qazanır. Kodu təkrarlamamaq üçün yeni sinfi extends ilə köhnəsindən törədirik: o, valideyn sinfin bütün metodlarını miras alır. Törəmə sinfin konstruktorunda əvvəlcə super(...) çağırılmalıdır — bu, valideynin konstruktorunu işə salır. Eyni adlı metod yazsaq, o valideynin metodunu yenidən təyin edir, super.describe() isə valideyn versiyasını çağırır.

JavaScript
class BankAccount {
  constructor(owner, balance = 0) {
    this.owner = owner;
    this.balance = balance;
  }
  deposit(amount) { this.balance += amount; }
  describe() { return `${this.owner}: ${this.balance} AZN`; }
}

class SavingsAccount extends BankAccount {
  constructor(owner, balance, rate) {
    super(owner, balance);
    this.rate = rate;
  }
  addInterest() { this.deposit((this.balance * this.rate) / 100); }
  describe() { return `${super.describe()} (savings, ${this.rate}%)`; }
}

const leyla = new SavingsAccount('Leyla', 1000, 5);
leyla.addInterest();
console.log(leyla.describe());
console.log(leyla instanceof BankAccount);
▸ Gözlənilən nəticə
Leyla: 1050 AZN (savings, 5%)
true
İnteraktiv
Simulyasiya yüklənir…
Leyla addInterest() metodunu hər il bir dəfə çağırsa, onun 1000 manatı 10 ildə necə böyüyər? Faizi və müddəti dəyiş.

Gizli sahələr, getter-lər və statik metodlar

  • # ilə başlayan sahə gizlidir: ona yalnız sinfin içindən müraciət etmək olar. Kənardan home.#celsius yazmaq sintaksis xətasıdır.
  • get və set metodları xassə kimi oxunur və yazılır, amma arxada kod işləyir — məsələn, qiyməti yoxlayır.
  • static metod nüsxəyə yox, sinfin özünə aiddir və belə çağırılır: Thermostat.fromFahrenheit(68).
JavaScript
class Thermostat {
  #celsius = 20;

  get celsius() { return this.#celsius; }
  set celsius(value) {
    if (value < 5 || value > 30) {
      throw new RangeError('Temperature must be between 5 and 30');
    }
    this.#celsius = value;
  }
  get fahrenheit() { return (this.#celsius * 9) / 5 + 32; }
  static fromFahrenheit(f) {
    const t = new Thermostat();
    t.celsius = Math.round(((f - 32) * 5) / 9);
    return t;
  }
}

const home = new Thermostat();
home.celsius = 25;
console.log(home.celsius, home.fahrenheit);
try { home.celsius = 40; } catch (error) { console.log(error.name, '-', error.message); }
console.log(Thermostat.fromFahrenheit(68).celsius);
▸ Gözlənilən nəticə
25 77
RangeError - Temperature must be between 5 and 30
20
Setter yanlış qiyməti qəbul etmir: 40 dərəcə qadağandır, ona görə temperatur 25 olaraq qalır.

Öz xəta sinfin

Varisliyin çox faydalı tətbiqi öz xəta növlərini yaratmaqdır. Daxili Error sinfini genişləndirib name verəndə catch blokunda xətanın növünü instanceof ilə dəqiq müəyyən etmək olur və gözlənilən xətaları gözlənilməzlərdən ayırmaq asanlaşır.

JavaScript
class ValidationError extends Error {
  constructor(message) {
    super(message);
    this.name = 'ValidationError';
  }
}

function register(age) {
  if (age < 13) {
    throw new ValidationError('Too young to register');
  }
  return 'Welcome!';
}

for (const age of [16, 10]) {
  try {
    console.log(register(age));
  } catch (error) {
    if (error instanceof ValidationError) {
      console.log(`${error.name}: ${error.message}`);
    } else {
      throw error;
    }
  }
}
▸ Gözlənilən nəticə
Welcome!
ValidationError: Too young to register
TerminMənası
classobyektlər üçün çertyoj
newsinifdən yeni nüsxə yaradır
constructoryeni nüsxənin xassələrini təyin edir
extends / supervarislik və valideynə müraciət
#fieldyalnız sinfin içində görünən sahə
staticnüsxəyə yox, sinfə aid metod
Tapşırıq

Rectangle sinfini tamamla: konstruktor width və height-i yadda saxlasın, area() isə sahəni qaytarsın. Sonra Rectangle-in varisi olan Square sinfini yaz: onun konstruktoru tək side qəbul edib super-i çağırsın.

Tapşırıq · JavaScript
class Rectangle {
  constructor(width, height) {
    // save width and height
  }

  area() {
    // return the area
  }
}

class Square extends Rectangle {
  // constructor(side) → call super
}

const rect = new Rectangle(3, 4);
const square = new Square(5);
console.log(rect.area(), square.area());
console.log(square instanceof Rectangle);
console.log(square);
▸ Gözlənilən nəticə
12 25
true
Square { width: 5, height: 5 }

Əsas fikirlər

  • Sinif obyektlər üçün çertyojdur; nüsxələr new ilə yaradılır.
  • constructor xassələri təyin edir, this konkret nüsxəni göstərir.
  • extends varislik verir; törəmə sinfin konstruktorunda əvvəlcə super() çağırılır.
  • # sahələri gizlidir, get/set xassəyə nəzarət edir, static sinfin özünə aiddir.
  • Error sinfini genişləndirərək öz xəta növlərini yarada bilərsən.

Özünü yoxla

10 sual. Hər düzgün cavab XP qazandırır.

1 / 10
Sinifdən yeni nüsxə hansı operatorla yaradılır?