Ce face static
Un câmp sau o metodă static există o singură dată, pe clasă, nu în fiecare obiect creat cu new. Îl folosești prin numele clasei: Elev.numar, Data.azi(). Este potrivit pentru contoare comune, constante ale clasei și metode „fabrică” care creează obiecte.
În interiorul unei metode statice, this este clasa însăși, nu un obiect. O metodă statică nu poate folosi câmpurile obișnuite (de instanță) fără un obiect. Membrii statici se pot combina cu private, readonly și #.
Un bloc static, static { ... }, rulează o singură dată, când este definită clasa, și poate pregăti câmpurile statice cu cod mai complex. Parametrii generici ai clasei nu pot fi folosiți în membrii statici.
Exemple
Exemplul 1: Contor comun și metodă fabrică
class Elev {
static numar = 0;
static readonly SCOALA = "Colegiul Național Iași";
readonly id: number;
private constructor(public nume: string) {
Elev.numar++;
this.id = Elev.numar;
}
static inscrie(nume: string): Elev {
return new Elev(nume.trim());
}
}
const a = Elev.inscrie(" Ana ");
const b = Elev.inscrie("Mihai");
console.log(a.id, a.nume, b.id, b.nume);
console.log(`${Elev.numar} elevi la ${Elev.SCOALA}`);
Rezultat
1 Ana 2 Mihai
2 elevi la Colegiul Național Iași
Exemplul 2: Bloc static
Blocul rulează o dată, la definirea clasei, și construiește tabelul de conversie.
class Valuta {
static readonly cursuri = new Map<string, number>();
static {
const date: [string, number][] = [["EUR", 4.97], ["USD", 4.58], ["GBP", 5.83]];
for (const [cod, curs] of date) Valuta.cursuri.set(cod, curs);
}
static inLei(suma: number, cod: string): number {
return Math.round(suma * (Valuta.cursuri.get(cod) ?? NaN) * 100) / 100;
}
}
console.log(Valuta.inLei(100, "EUR"), Valuta.inLei(20, "USD"), Valuta.inLei(5, "CHF"));
Rezultat
497 91.6 NaN
Exemplul 3: Membru static folosit pe obiect
class Elev {
static numar = 0;
}
const e = new Elev();
console.log(e.numar);
Eroarea afișată de tsc
exemplu.mts(5,15): error TS2576: Property 'numar' does not exist on type 'Elev'. Did you mean to access the static member 'Elev.numar' instead?
Greșeli frecvente
- Folosești
this.numarpentru un câmp static într-o metodă obișnuită.thiseste obiectul; scrieElev.numar. - Pui stare care ar trebui să fie a fiecărui obiect într-un câmp static. Toate obiectele o împart și se suprascriu unele pe altele.
Comenzi înrudite
class: Clasele din JavaScript, cu tipuri pe câmpuri, constructor și metode, plus modificatori de acces și interfețe.#câmpuri private: Câmpurile care încep cu # sunt private și la rulare: nu pot fi citite deloc din afara clasei.readonly: Marchează o proprietate care primește valoare o singură dată și nu mai poate fi modificată după aceea.public, private, protected: Modificatorii de acces spun cine poate folosi un câmp sau o metodă: oricine, doar clasa sau și clasele derivate.