Static members va static initialization blocks
Foydalanuvchi classining nechta instansi yaratilganini bilish kerak. Bu ma'lumot bitta instansga emas, classning o'ziga tegishli. Static members — class darajasida saqlanadi, instanslarda emas.
static xususiyat va metod
class Foydalanuvchi {
static soni: number = 0;
readonly id: number;
ism: string;
constructor(ism: string) {
Foydalanuvchi.soni++; // class orqali
this.id = Foydalanuvchi.soni;
this.ism = ism;
}
static reset(): void {
Foydalanuvchi.soni = 0;
}
}
new Foydalanuvchi("Ali");
new Foydalanuvchi("Vali");
Foydalanuvchi.soni; // 2 — class orqali, instans orqali emas
Foydalanuvchi.reset();
Foydalanuvchi.soni; // 0
Singleton pattern
class DatabaseUlanish {
private static instans: DatabaseUlanish | null = null;
private constructor(private url: string) {}
static olish(): DatabaseUlanish {
if (!DatabaseUlanish.instans) {
DatabaseUlanish.instans = new DatabaseUlanish(
process.env.DATABASE_URL || "localhost"
);
}
return DatabaseUlanish.instans;
}
so_rovYuborish(sql: string): void {
console.log(`[${this.url}] ${sql}`);
}
}
const db1 = DatabaseUlanish.olish();
const db2 = DatabaseUlanish.olish();
db1 === db2; // true — bir xil instans
static initialization block
Constructor dan oldin murakkab statik boshlang'ich qiymatlar uchun:
class Sozlamalar {
static readonly HOST: string;
static readonly PORT: number;
static readonly SSL: boolean;
static {
// Murakkab mantiq — try/catch, shartlar
Sozlamalar.HOST = process.env.HOST ?? "localhost";
Sozlamalar.PORT = parseInt(process.env.PORT ?? "5432");
Sozlamalar.SSL = process.env.NODE_ENV === "production";
}
}
Sozlamalar.HOST; // "localhost" yoki env qiymati
static va meros
Static xususiyatlar meros orqali o'tilmaydi — to'g'ridan class orqali:
class A {
static qiymat = 10;
}
class B extends A {
static yangi = A.qiymat * 2; // ✅
}
B.qiymat; // ✅ meros olgan (prototip zanjiri orqali)
B.yangi; // 20
Tez-tez uchraydigan xatolar
this bilan static xususiyatga kirish:
class A {
static x = 0;
metod() {
this.x; // ❌ — instance da x yo'q
A.x; // ✅ — class nomi bilan
}
}
Xulosa
class MyClass {
static soni: number = 0; // class darajasida
static readonly MAX: number = 100;
static { // static initialization block
MyClass.soni = parseInt(env.X ?? "0");
}
static yaratish(): MyClass { // factory method
return new MyClass();
}
}
// Kirish — class nomi orqali
MyClass.soni;
MyClass.yaratish();
// Instans orqali emas: new MyClass().soni ❌
Keyingi dars
43-dars: Abstract class — mavhum sinflar va metodlar