ES6 klasslari (Classes), constructor metodi, class fields, getter va setterlar, static metodlar hamda # belgisi orqali xususiy (private) maydonlar.
Chapter 21'da Prototype mexanizmini o'rgandik. class — ES6'da qo'shilgan, aynan shu mexanizmni yanada tushunarli va tanish sintaksis bilan yozish imkonini beruvchi vosita.
class — object yaratish uchun "shablon" (blueprint). U Chapter 21'dagi Constructor Function + Prototype naqshining zamonaviy, chiroyli yozilish shakli.
🏗️ Class — bu bino qurish uchun loyiha (chizma). Loyihaning o'zi — bino emas, lekin undan bir nechta bir xil tuzilishdagi bino (object) qurish mumkin.
script.jsJavaScriptclass Person {constructor(name, age) {this.name = name;this.age = age;}greet() {console.log(`Salom, men ${this.name}man`);}}let user = new Person("Ali", 25);user.greet(); // "Salom, men Aliman"
constructor — new bilan object yaratilganda avtomatik chaqiriladigan maxsus metod, unda boshlang'ich propertylar belgilanadi.greet() — bu metod, aslida "sahna orqasida" Person.prototype.greet sifatida saqlanadi (Chapter 21'dagidek).🔗 Connection
class — Chapter 21'da o'rgangan Prototype mexanizmining ustiga qurilgan syntactic sugar (sintaksisni "shirin" qilib ko'rsatish). Ichki mexanizm bir xil, faqat yozilishi qulayroq.
| Xususiyat | Constructor Function | Class |
|---|---|---|
| Hoisting | To'liq hoisting qilinadi | Hoisting qilinadi, lekin TDZ'da (Chapter 11) |
| newsiz chaqirish | Xato bermasdan noto'g'ri ishlaydi | Xatolik beradi (xavfsizroq!) |
| Metod yozish | Constructor.prototype.method = ... | To'g'ridan-to'g'ri class ichida |
script.jsJavaScriptclass Person {constructor(name) {this.name = name;}}Person("Ali"); // ❌ TypeError: Class constructor Person cannot be invoked without 'new'
💡 Key Idea
Bu — Chapter 21'dagi "Debugging Challenge"da ko'rgan muammoning (constructor function'ni newsiz chaqirish) class bilan avtomatik oldini olinishi. class bu turdagi xatoni "sukut bo'yicha" oldini oladi.
script.jsJavaScriptclass Product {constructor(name, price) {this.name = name;this.price = price;}}
script.jsJavaScriptclass Product {category = "General"; // default qiymat bilan propertyconstructor(name, price) {this.name = name;this.price = price;}}let item = new Product("Laptop", 1200);console.log(item.category); // "General"
Getter — propertyni "o'qish" (kabi ko'rinadigan, lekin aslida function bo'lgan) usuli. Setter — propertyga "qiymat berish" jarayonini nazorat qilish usuli.
Ba'zida property qiymati to'g'ridan-to'g'ri saqlanmaydi, balki boshqa propertylardan hisoblanadi, yoki qiymat berilishidan oldin tekshirilishi kerak bo'ladi.
script.jsJavaScriptclass Circle {constructor(radius) {this._radius = radius;}get area() {return Math.PI * this._radius ** 2;}set radius(value) {if (value <= 0) {throw new Error("Radius musbat bo'lishi kerak");}this._radius = value;}get radius() {return this._radius;}}let circle = new Circle(5);console.log(circle.area); // 78.53... (function emas, property kabi chaqiriladi!)circle.radius = 10; // setter ishga tushadiconsole.log(circle.area); // 314.15...
E'tibor bering: circle.area — qavs () bilan emas, oddiy property kabi o'qilyapti, lekin aslida bu — har safar _radius asosida qayta hisoblanadigan getter.
⚠️ Common Mistake
Property nomi (radius) bilan ichki saqlash uchun ishlatiladigan nom (_radius) bir xil bo'lsa, infinite loop yuzaga keladi (getter o'zini-o'zi cheksiz chaqiraveradi). Shuning uchun ichki saqlash uchun odatda oldiga _ qo'yiladi.
🔗 Connection
Getter/Setter — Chapter 24'da o'rganiladigan Encapsulation tushunchasining asosiy vositalaridan biri.
static — class'ning o'zida mavjud bo'ladigan (instance'larda emas) metod yoki property. Bu haqda Chapter 25'da chuqurroq to'xtalamiz, lekin qisqacha ko'rib chiqamiz.
script.jsJavaScriptclass MathHelper {static square(x) {return x * x;}}console.log(MathHelper.square(5)); // 25let helper = new MathHelper();helper.square(5); // ❌ Xatolik — instance'da mavjud emas
static metodlar — object yaratmasdan, to'g'ridan-to'g'ri class nomi orqali chaqiriladi. Bu ko'pincha "yordamchi" (utility) function'lar uchun ishlatiladi.
# belgisi bilan boshlangan propertylar — private, ya'ni class tashqarisidan mutlaqo kirib bo'lmaydi.
script.jsJavaScriptclass BankAccount {#balance = 0;deposit(amount) {this.#balance += amount;}getBalance() {return this.#balance;}}let account = new BankAccount();account.deposit(100);console.log(account.getBalance()); // 100console.log(account.#balance); // ❌ SyntaxError — tashqaridan kirib bo'lmaydi
🔥 Important
Bu — Chapter 12'da Closure orqali erishilgan "private variable" g'oyasining, class sintaksisidagi rasmiy va zamonaviy ifodasi. Farqi shundaki, # bilan private field'lar closure'dan farqli, class strukturasining rasmiy qismi hisoblanadi va IDE/debugger'lar tomonidan yaxshiroq qo'llab-quvvatlanadi.
Task:
Animal nomli class yarating, constructorda name va sound qabul qilsin, makeSound() metodi "{name} {sound} deydi" chiqarsin.
Required Concepts:
class, constructor, methodthis.name, this.sounddan foydalaning.Task:
Rectangle class yarating, width va height bilan, get area() va get perimeter() getter'larini qo'shing.
Required Concepts:
get area() { return this.width * this.height; }Task:
#pin (private field) bilan ATM class yarating. constructorda PIN kod belgilansin. withdraw(amount, enteredPin) metodi — agar enteredPin mos kelmasa xatolik chiqarsin, mos kelsa va balansda yetarli mablag' bo'lsa pul yechilsin.
Required Concepts:
#balance va #pinni ikkalasini ham private qiling.script.jsJavaScriptclass Counter {#count = 0;increment() {this.#count++;return this.#count;}}let c1 = new Counter();let c2 = new Counter();console.log(c1.increment());console.log(c1.increment());console.log(c2.increment());
🧠 Think first! Javobni ko'rishdan oldin kamida 30 soniya o'ylang.
<details> <summary>Answer</summary> 1 2 1Why?
c1 va c2 — ikkalasi ham Counterning alohida instance'lari, shuning uchun har biri o'zining alohida #count qiymatiga ega. Bu — Chapter 12'da closure orqali ko'rgan createCounter() misolining class ko'rinishidagi analogi.
Quyidagi kodda muammo bor:
script.jsJavaScriptclass Circle {constructor(radius) {this.radius = radius;}get radius() {return this.radius;}set radius(value) {this.radius = value;}}let c = new Circle(5);
Your Task:
Yechim: Ichki saqlash uchun boshqa nom (masalan, _radius) ishlatish kerak:
</details>script.jsJavaScriptclass Circle {constructor(radius) {this._radius = radius;}get radius() {return this._radius;}set radius(value) {this._radius = value;}}let c = new Circle(5);console.log(c.radius); // 5
class — Prototype mexanizmining zamonaviy, tushunarli sintaksisi.constructor — object yaratilganda avtomatik chaqiriladi.static — instance'larsiz, to'g'ridan-to'g'ri class orqali chaqiriladigan metod/property.# bilan private field'lar — class tashqarisidan kirib bo'lmaydigan ma'lumot.class — ichki jarayoni Prototype bilan bir xil, faqat yozilishi qulayroq va xavfsizroq.classni newsiz chaqirish — avtomatik xatolik beradi (Constructor Function'dan farqli).#) — zamonaviy va rasmiy encapsulation usuli.static metodlar — instance yaratmasdan foydalaniladigan "yordamchi" function'lar uchun ideal.script.jsJavaScriptclass Person {#secret = "hidden";constructor(name) {this.name = name;}greet() {return `Salom, ${this.name}`;}get info() {return `Ism: ${this.name}`;}static create(name) {return new Person(name);}}let p = new Person("Ali");p.greet();p.info;Person.create("Vali");
Mavzu bo‘yicha tushunchalaringizni interaktiv test orqali sinovdan o‘tkazing va natijalarni bilib oling.
Darslikda o‘rganilgan qoidalarga asosan real kod yozing, testlardan o‘tkazing va yechimlarni mustahkamlang.
Test Sinovi
Hali topshirilmagan (kamida 75% kerak)
Amaliy Masalalar
0 / 3 ta yechildi (kamida 75% kerak)
Dars sifati va mazmunini yaxshilash uchun o‘z haqqoniy bahoingizni qoldiring.
Mavzuni to‘liq o‘zlashtirish uchun test sinovi, amaliy kodlash va bog‘liq darslar
O‘z bilimingizni interaktiv test savollari orqali tekshiring va darhol xatolarni tahlil qiling.
Nazariyani real kod yozish bilan mustahkamlang, avtomatik testlardan o‘ting va XP to‘plang.
Kurs bo‘yicha keyingi va bog‘liq mavzular: