Гузариш ба мундариҷа
Мавзӯи 15 аз 16
Назария

Синфҳо

Ин барои чӣ лозим аст

Фарз кунем, дар бозӣ сад душман ҳаст. Ҳар кадом ном, саломатӣ, ҳамла ва амалҳои якхела дорад: «задан», «зарба гирифтан». Сад объектро дастӣ навиштан — дароз аст. Синф (класс) — нақша аст: аз рӯи он ҳар қадар объекти як намудро, ки хоҳед, сохтан мумкин аст. Чунин объектро намуна-и (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 вай нест.

Хатоҳои маъмул

  1. Бе new. User("Аня") → TypeError: Class constructor User cannot be invoked without 'new'.
  2. Бе this. name = name дар конструктор ба объект ҳеҷ чиз нигоҳ намедорад. Лозим аст this.name = name.
  3. super() фаромӯш шуд. Дар конструктори фарзандӣ муроҷиат ба this пеш аз super(...) — хато.
  4. Вергул байни усулҳо. Дар синф усулҳо бе вергул навишта мешаванд (баръакси объект).
  5. Геттер бо қавсҳо. 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

Росткунҷа

Осон+10 XP

Синфи Rectangle-ро нависед:

  • конструктор width ва height-ро мегирад ва онҳоро дар хосиятҳои ҳамном нигоҳ медорад;
  • усули area() масоҳатро бармегардонад;
  • усули perimeter() периметрро бармегардонад.
const r = new Rectangle(3, 4);
r.area()       → 12
r.perimeter()  → 14

Барои ҳал кардани масъалаҳо коннекторро пайваст кун

Коди масъалаҳо дар компютери худат иҷро мешавад — ин аз браузер тезтар ва боэътимодтар аст. Барои ин барномаи ройгони коннектори CodeWithMe лозим аст. Онро як бор пайваст кардан кифоя аст.

Коннекторро дар ин компютер ҷустуҷӯ мекунем…

  1. 1
    Коннекторро барои системаи худ (Windows, macOS ё Linux) зеркашӣ кун.Зеркашии коннекторДар саҳифаи зеркашӣ файлеро интихоб кун, ки дар номаш системаи ту ҳаст, масалан windows-amd64.
  2. 2Онро иҷро кун ва ҷузвдонеро интихоб кун, ки ҳалҳоят дар он ҷо меистанд. Python ва Node.js-ро ӯ худаш ҳангоми зарурат ба он ҷо мегузорад.
  3. 3
    Дар поён рамзи 6-рақамаро ворид кун — он дар равзанаи коннектор навишта шудааст («Рамз барои сайти CodeWithMe»). Агар браузер дар бораи дастрасӣ ба шабакаи маҳаллӣ пурсад — иҷозат деҳ.

Коннектор кушода аст (рамзи манбаъ дар GitHub), танҳо дар компютери ту кор мекунад ва кодро танҳо пас аз ворид кардани рамзи пайвастшавӣ иҷро мекунад.