MySQL Java JavaScript PHP Python HTML-CSS C-sharp

Câmpuri și metode private

În temele anterioare, am folosit o clasă cu proprietăți și metode care erau accesibile din exterior, ceea ce însemna că le puteam accesa de oriunde în program. De exemplu:

class Person{

   constructor(name, age){
       this.name = name;
       this.age = age;
   }
   print(){
       console.log(`Name: ${this.name}  Age: ${this.age}`);
   }
}
const tom = new Person("Tom", 37);
tom.name = "Sam";
tom.age = -45;
tom.print();    // Name: Sam  Age: -45

Pe de o parte, este minunat că putem utiliza funcționalitățile unei clase în programul nostru, să accesăm proprietățile și metodele acesteia. Cu toate acestea, acest lucru poate fi sursa unor potențiale probleme. După cum se poate observa în exemplul de mai sus, putem schimba numele unei persoane.

Dar ce se întâmplă dacă nu dorim ca în program să se poată schimba numele inițial? De asemenea, putem schimba vârsta unei persoane, dar o putem modifica la orice valoare, inclusiv la un număr care poate reprezenta o vârstă incorectă (de exemplu, negativă).

Uneori este necesar ca datele sau acțiunile să nu poată fi accesate din afara clasei și să poată fi accesate doar în interiorul aceleiași clase. Cu alte cuvinte, să facem proprietățile și metodele clasei private - accesibile doar clasei respective.

Și limbajul JavaScript oferă instrumentele necesare pentru aceasta. Pentru a face un câmp sau o metodă privat(ă), numele acestuia trebuie să înceapă cu simbolul #.

Câmpuri private

Numele câmpurilor private sunt precedate de simbolul #:

class Person {
   #name;
   #age;
   constructor(name, age) {
       this.#name = name;
       this.#age = age;
   }
   print() {
       console.log(`Nume: ${this.#name}  Vârstă: ${this.#age}`);
   }
}
const tom = new Person("Tom", 37);
// tom.#name = "Sam";   // ! Eroare - nu se poate accesa un câmp privat
// tom.#age = -45;      // ! Eroare - nu se poate accesa un câmp privat
tom.print();    // Nume: Tom  Vârstă: 37

În exemplul de mai sus, sunt definite câmpuri private #name și #age. Valoarea acestora poate fi setată și obținută doar în interiorul clasei Person. În afara acestei clase, ele nu sunt accesibile. Prin urmare, încercarea de a le accesa folosind numele obiectului va genera o eroare:

// tom.#name = "Sam";   // ! Eroare - nu se poate accesa un câmp privat
// tom.#age = -45;      // ! Eroare - nu se poate accesa un câmp privat

Dacă va fi necesar să le accesăm într-un fel, putem defini metode pentru aceasta. De exemplu, mai sus, metoda print() primește valorile lor și le afișează în consolă. În mod similar, putem defini și metode pentru a le seta:

class Person{
   #name;
   #age= 1;
   constructor(name, age){
       this.#name = name;
       this.setAge(age);
   }
   setAge(age){
       if (age > 0 && age < 110) this.#age = age;
   }
   print(){
       console.log(`Name: ${this.#name}  Age: ${this.#age}`);
   }
}
const tom = new Person("Tom", 37);
tom.print();    // Name: Tom  Age: 37
tom.setAge(22);
tom.print();    // Name: Tom  Age: 22
tom.setAge(-1234);
tom.print();    // Name: Tom  Age: 22

În acest caz, metoda setAge verifică corectitudinea valorii furnizate și, dacă aceasta este corectă, reinițializează vârsta.

Metode private

Numele metodelor private sunt, de asemenea, precedate de simbolul #:

lass Person {
   #name = "undefined";
   #age = 1;

   constructor(name, age) {
       this.#name = this.#checkName(name);
       this.setAge(age);
   }

   #checkName(name) {
       if (name !== "admin") return name;
   }

   setAge(age) {
       if (age > 0 && age < 110) this.#age = age;
   }

   print() {
       console.log(`Nume: ${this.#name}  Vârstă: ${this.#age}`);
   }
}

const tom = new Person("Tom", 37);
tom.print();    // Nume: Tom  Vârstă: 37

const bob = new Person("admin", 41);
bob.print();    // Nume: Necunoscut  Vârstă 41

//let personName = bob.#checkName("admin"); // ! Eroare - nu se poate accesa metoda privată

În exemplul de mai sus, este definit o metodă privată #checkName(), care efectuează o verificare condițională a numelui - dacă nu este egal cu "admin", atunci returnează valoarea furnizată. (De exemplu, nu dorim ca numele utilizatorului să fie "admin"). În plus, în afara clasei, nu putem accesa această metodă:

let personName = bob.#checkName("admin");   // ! Eroare

De obicei, astfel de metode private sunt folosite pentru a executa acțiuni auxiliare, cum ar fi validarea în exemplul de mai sus, și nu are sens să le facem disponibile din exterior.

← Lecția anterioară Lecția următoare →