Синфҳо
Ин барои чӣ лозим аст
Фарз кунем, дар бозӣ сад душман ҳаст. Ҳар кадом ном, саломатӣ, ҳамла ва амалҳои якхела дорад: «задан», «зарба гирифтан». Сад объектро дастӣ навиштан — дароз аст. Синф (класс) — нақша аст: аз рӯи он ҳар қадар объекти як намудро, ки хоҳед, сохтан мумкин аст. Чунин объектро намуна-и (instance) синф меноманд.
Бисёр китобхонаҳо бар синфҳо сохта шудаанд, ва Map, Set, Date, Error-и дарунсохт низ синфҳоянд.
Эълони синф
class User {
constructor(name, age) {
this.name = name;
this.age = age;
}
greet() {
return `Салом, ман ${this.name}`;
}
}
const anya = new User("Аня", 15);
const timur = new User("Тимур", 17);
console.log(anya.greet());
console.log(timur.age);
Натиҷа:
Салом, ман Аня
17
class User { … }— эълони синф. Номҳои синфҳоро бо ҳарфи калон менависанд.constructor— усули махсус, ки ҳангоми сохтани объект даъват мешавад. Дар он хосиятҳоро медиҳанд.this— объекти сохташаванда.this.name = nameқиматро ба хосиятиname-и он мегузорад.new User(…)— сохтани намуна. Беnewхато мешавад.- Усулҳо (
greet) дар дохили синф бе калимаиfunctionва бе вергул байни онҳо навишта мешаванд.
Усулҳо ҳолатро иваз мекунанд
class Counter {
constructor() {
this.value = 0;
}
increase(step = 1) {
this.value += step;
return this.value;
}
}
const c = new Counter();
c.increase();
c.increase(5);
console.log(c.value);
Натиҷа:
6
Ҳар намуна хосиятҳои худ-ро нигоҳ медорад: ду Counter-и гуногун мустақилона ҳисоб мекунанд.
Геттерҳо ва сеттерҳо
Геттер — усулест, ки мисли хосият, бе қавсҳо хонда мешавад. Сеттер — усулест, ки ҳангоми бахшидан кор мекунад.
class Temperature {
constructor(celsius) {
this.celsius = celsius;
}
get fahrenheit() {
return this.celsius * 9 / 5 + 32;
}
set fahrenheit(f) {
this.celsius = (f - 32) * 5 / 9;
}
}
const t = new Temperature(25);
console.log(t.fahrenheit);
t.fahrenheit = 212;
console.log(t.celsius);
Натиҷа:
77
100
Геттер барои қиматҳои ҳисобшаванда ва барои «танҳо хондан» қулай аст: агар сеттер набошад, қимат бахшидан имконнопазир аст.
Майдонҳои хусусӣ
Майдон бо # дар аввали ном танҳо дар дохили синф намоён аст:
class Wallet {
#money = 0;
add(x) { this.#money += x; }
get total() { return this.#money; }
}
const w = new Wallet();
w.add(50);
console.log(w.total);
Натиҷа:
50
Аз берун w.#money — хатои синтаксисӣ. Ҳамин тавр додаҳоро аз тағйироти тасодуфӣ муҳофизат мекунанд. Бо
тарзи кӯҳна майдонҳои «дохилӣ»-ро бо зерхат ишора мекунанд (this._money) — ин танҳо як созишномаест.
Мерос: extends ва super
Синф метавонад аз синфи дигар мерос гирад: ҳамаи хосиятҳо ва усулҳои онро гирад ва худашро илова кунад.
class Animal {
constructor(name) {
this.name = name;
}
speak() {
return `${this.name} садо мебарорад`;
}
sleep() {
return `${this.name} хоб аст`;
}
}
class Cat extends Animal {
speak() {
return `${this.name} миёв мекунад`;
}
}
const murka = new Cat("Мурка");
console.log(murka.speak()); // усули худ
console.log(murka.sleep()); // меросӣ
console.log(murka instanceof Cat, murka instanceof Animal);
Натиҷа:
Мурка миёв мекунад
Мурка хоб аст
true true
Агар синфи фарзандӣ constructor-и худро дошта бошад, дар он пеш аз ҳама super(...) — конструктори
волидро даъват кардан лозим аст:
class Student extends Animal {
constructor(name, school) {
super(name); // волид this.name-ро менависад
this.school = school;
}
speak() {
return super.speak() + " ва дарсро ҷавоб медиҳад"; // даъвати усули волид
}
}
console.log(new Student("Тимур", "№5").speak());
Натиҷа:
Тимур садо мебарорад ва дарсро ҷавоб медиҳад
Усулҳои статикӣ
static — усули худи синф аст, на намунаҳо: Math.max ба ин монанд сохта шудааст.
class MathUtil {
static square(x) { return x * x; }
}
console.log(MathUtil.square(7));
Натиҷа:
49
Дар дохил чӣ гуна кор мекунад
Усулҳои синф ба ҳар объект нусхабардорӣ намешаванд — онҳо дар як ҷойи умумӣ, прототип (User.prototype)
ҷой доранд. Вақте ки anya.greet()-ро даъват мекунед, JS greet-ро аввал дар худи объект меҷӯяд, намеёбад ва
ба прототип меравад. Ҳангоми мерос прототипҳо занҷир месозанд: Cat.prototype → Animal.prototype →
Object.prototype. Ҷустуҷӯ аз рӯи занҷир то ёфтани усул идома меёбад. Бинобар ин murka.sleep() кор мекунад,
гарчанде ки дар Cat вай нест.
Хатоҳои маъмул
- Бе
new.User("Аня")→TypeError: Class constructor User cannot be invoked without 'new'. - Бе
this.name = nameдар конструктор ба объект ҳеҷ чиз нигоҳ намедорад. Лозим астthis.name = name. super()фаромӯш шуд. Дар конструктори фарзандӣ муроҷиат баthisпеш азsuper(...)— хато.- Вергул байни усулҳо. Дар синф усулҳо бе вергул навишта мешаванд (баръакси объект).
- Геттер бо қавсҳо.
acc.balance()→ хатои «is not a function». Геттерро бе қавсҳо мехонанд:acc.balance.
Ёддошт
| Чӣ | Чӣ тавр |
|---|---|
| Синф | class Name { constructor(a) { this.a = a; } } |
| Намуна | const x = new Name(1); |
| Усул | go() { return this.a; } |
| Геттер / сеттер | get total() {…}, set total(v) {…} |
| Майдони хусусӣ | #secret = 0; |
| Мерос | class B extends A { … } |
| Волид | super(…) дар конструктор, super.method() |
| Усули статикӣ | static create() {…} |
| Санҷиш | x instanceof Name |