constructorvə metodları olan sinif yazıbnewilə nüsxələr yaratmaqextendsvəsuperilə sinfi genişləndirmək və metodu yenidən təyin etmək#gizli sahələrindən, getter/setter-lərdən vəstaticmetodlardan 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.
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
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.
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
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ənardanhome.#celsiusyazmaq sintaksis xətasıdır.getvəsetmetodları xassə kimi oxunur və yazılır, amma arxada kod işləyir — məsələn, qiyməti yoxlayır.staticmetod nüsxəyə yox, sinfin özünə aiddir və belə çağırılır:Thermostat.fromFahrenheit(68).
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
Ö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.
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
| Termin | Mənası |
|---|---|
class | obyektlər üçün çertyoj |
new | sinifdən yeni nüsxə yaradır |
constructor | yeni nüsxənin xassələrini təyin edir |
extends / super | varislik və valideynə müraciət |
#field | yalnız sinfin içində görünən sahə |
static | nüsxəyə yox, sinfə aid metod |
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.
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
newilə yaradılır. constructorxassələri təyin edir,thiskonkret nüsxəni göstərir.extendsvarislik verir; törəmə sinfin konstruktorunda əvvəlcəsuper()çağırılır.#sahələri gizlidir,get/setxassəyə nəzarət edir,staticsinfin özünə aiddir.Errorsinfini 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.