Klasslarning statik xossalari va metodlari (static), instance vs static taqqoslash, Static Factory Methods naqshi hamda ES2022 Static bloklari.
Bu bob bilan PART 3 (Object-Oriented JavaScript) yakunlanadi. Chapter 22'da staticni qisqacha ko'rgan edik — endi uni chuqurroq, amaliy misollar bilan o'rganamiz.
static — class'ning o'ziga tegishli (instance'larga emas) metod yoki property. Ya'ni, uni ishlatish uchun new orqali object yaratish shart emas.
🏭 Instance metodlari — bu "har bir mahsulot" (masalan, har bir mashina)ning o'z xususiyati (masalan, mashinaning rangi). Static metodlar esa — "zavodning o'zi" bajaradigan ish (masalan, "necha mashina ishlab chiqarildi" statistikasi) — bu alohida mashinaga emas, butun zavodga tegishli.
script.jsJavaScriptclass MathUtils {static PI = 3.14159;static square(x) {return x * x;}static isEven(x) {return x % 2 === 0;}}console.log(MathUtils.PI); // 3.14159console.log(MathUtils.square(5)); // 25console.log(MathUtils.isEven(4)); // true
MathUtilsdan hech qachon new MathUtils() orqali object yaratilmadi — chunki bu class faqat "yordamchi" (utility) metodlar to'plami sifatida ishlatilmoqda.
⚠️ Common Mistake
Static metodni instance orqali chaqirishga urinish ishlamaydi:
script.jsJavaScriptlet obj = new MathUtils();obj.square(5); // ❌ TypeError: obj.square is not a function
| Xususiyat | Instance metod/property | Static metod/property |
|---|---|---|
| Kimga tegishli | Har bir alohida object'ga | Class'ning o'ziga |
| Qanday chaqiriladi | object.method() | ClassName.method() |
| this nimani anglatadi | O'sha instance'ni | Class'ning o'zini |
| Qachon ishlatiladi | Har bir object o'ziga xos ma'lumotga ega bo'lganda | Umumiy, "yordamchi" mantiq uchun |
script.jsJavaScriptclass Product {static totalProducts = 0; // static propertyconstructor(name, price) {this.name = name; // instance propertythis.price = price; // instance propertyProduct.totalProducts++; // static propertyni yangilash}getInfo() {return `${this.name}: ${this.price} so'm`;}static getTotalCount() {return `Jami mahsulotlar: ${Product.totalProducts}`;}}let p1 = new Product("Laptop", 1200);let p2 = new Product("Mouse", 20);console.log(p1.getInfo()); // "Laptop: 1200 so'm" (instance)console.log(Product.getTotalCount()); // "Jami mahsulotlar: 2" (static)
new Product(...) chaqirilganda, Product.totalProducts — barcha instance'lar uchun umumiy son — birga oshadi.p1.totalProducts deb yozib bo'lmaydi — bu instance'da mavjud emas, faqat Product.totalProducts orqali kirish mumkin.💡 Key Idea
Static property — barcha instance'lar orasida "bo'lishiladigan" (shared) yagona ma'lumot, xuddi Chapter 21'dagi prototype metodlar kabi, lekin bu safar property uchun ham.
Factory Method — object yaratishning muqobil, ko'pincha qulayroq usulini taqdim etuvchi static metod.
Ba'zida new ClassName(...) orqali object yaratish yetarlicha tushunarli emas, yoki bir nechta turli usulda object yaratish kerak bo'ladi.
script.jsJavaScriptclass Point {constructor(x, y) {this.x = x;this.y = y;}}let p1 = new Point(3, 4); // oddiy koordinatalardan
Endi, agar biz Point'ni stringdan ("3,4") yoki polar koordinatalardan (radius, burchak) yaratmoqchi bo'lsak-chi? Buni bitta constructor bilan chiroyli qilib bo'lmaydi (chunki JavaScript'da constructor overloading yo'q — Chapter 23'da ko'rgan edik).
script.jsJavaScriptclass Point {constructor(x, y) {this.x = x;this.y = y;}static fromString(str) {let [x, y] = str.split(",").map(Number);return new Point(x, y);}static fromPolar(radius, angle) {let x = radius * Math.cos(angle);let y = radius * Math.sin(angle);return new Point(x, y);}}let p1 = new Point(3, 4);let p2 = Point.fromString("5,6");let p3 = Point.fromPolar(10, Math.PI / 2);console.log(p2.x, p2.y); // 5 6
code.textTEXTPoint.fromString("5,6")│▼ ichkaridaparse qilinadi → new Point(5, 6)│▼yangi Point object qaytariladi
fromString va fromPolar — ikkalasi ham "Point yaratishning muqobil yo'llari", ular ichkarida asl constructorni chaqiradi, lekin foydalanuvchiga qulayroq "kirish nuqtasi" (interfeys) taqdim etadi.
🔥 Important
Bu naqsh — ko'plab mashhur JavaScript kutubxonalarida (masalan, Array.from(), Object.fromEntries()) ishlatiladi. Ular ham — aslida static factory metodlar.
Static blok — class yuklanganda bir marta ishga tushadigan, murakkab static property'larni sozlash uchun ishlatiladigan maxsus blok.
script.jsJavaScriptclass Config {static settings;static {// Murakkab sozlash mantiqiConfig.settings = {apiUrl: "[https://api.example.com](https://api.example.com)",version: "1.0"};console.log("Config yuklandi");}}console.log(Config.settings.apiUrl); // "[https://api.example.com](https://api.example.com)"
🔗 Connection
Static bloklar — nisbatan yangi (ES2022) xususiyat, ular kamdan-kam ishlatiladi, lekin murakkab boshlang'ich sozlash (initialization) kerak bo'lganda foydali.
Task:
Calculator nomli class yarating, unda faqat static metodlar bo'lsin: add(a, b), subtract(a, b), multiply(a, b).
Required Concepts:
static methodsnew Calculator() yaratmang, to'g'ridan-to'g'ri Calculator.add(2, 3) deb chaqiring.Task:
User class yarating, unga static userCount = 0 qo'shing. Har safar new User() chaqirilganda userCount avtomatik oshsin. static getUserCount() metodi orqali umumiy sonni chiqaring.
Required Concepts:
static propertyconstructorProduct misolidan namuna oling.Task:
Temperature class yarating (celsius bilan). Ikkita static factory metod qo'shing: fromFahrenheit(f) va fromKelvin(k) — ular berilgan qiymatlarni Celsiusga aylantirib, yangi Temperature object qaytarsin.
Required Concepts:
C = (F - 32) * 5/9, C = K - 273.15script.jsJavaScriptclass Counter {static count = 0;constructor() {Counter.count++;this.id = Counter.count;}}let a = new Counter();let b = new Counter();let c = new Counter();console.log(a.id, b.id, c.id);console.log(Counter.count);
🧠 Think first! Javobni ko'rishdan oldin kamida 30 soniya o'ylang.
<details> <summary>Answer</summary> 1 2 3 3Why?
Counter.count — barcha instance'lar orasida umumiy (shared) static property. Har safar yangi Counter yaratilganda, u oshadi va shu qiymat instance'ning idsiga saqlanadi. Uchta object yaratilgani uchun, oxirida Counter.count — 3ga teng.
Quyidagi kodda muammo bor:
script.jsJavaScriptclass Logger {log(message) {console.log(`[LOG]: ${message}`);}}Logger.log("Dastur ishga tushdi");
Your Task:
Yechim 1 — static qilish:
script.jsJavaScriptclass Logger {static log(message) {console.log(`[LOG]: ${message}`);}}Logger.log("Dastur ishga tushdi");
Yechim 2 — instance yaratish:
</details>script.jsJavaScriptclass Logger {log(message) {console.log(`[LOG]: ${message}`);}}let logger = new Logger();logger.log("Dastur ishga tushdi");
static — class'ning o'ziga tegishli, instance yaratmasdan ishlatiladigan metod/property.ClassName.method() orqali, instance'siz chaqiriladi.Array.from(), Object.fromEntries() kabi tayyor JS metodlari — static factory naqshining haqiqiy misollari.script.jsJavaScriptclass Utils {static VERSION = "1.0";static formatDate(date) {return date.toLocaleDateString();}static fromTimestamp(ts) {return new Date(ts);}}Utils.VERSION; // static propertyUtils.formatDate(new Date()); // static methodUtils.fromTimestamp(123456); // static factory method
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: