Cum să faci o proprietate a unui obiect neschimbabilă?
sobes.tech AI
Răspuns de la AI
Cum să faceți o proprietate a obiectului imuabilă poate fi realizat în mai multe moduri:
-
Utilizarea
Object.defineProperty():Această metodă permite definirea sau modificarea proprietăților unui obiect cu un control mai granular. Pentru a crea o proprietate imuabilă, trebuie să setați descriptorul proprietății cu
writable: false.const obj = {}; Object.defineProperty(obj, 'myProperty', { value: 'Valoare imuabilă', writable: false, // Face proprietatea imuabilă enumerable: true, // Proprietatea va fi vizibilă la iterare configurable: true // Proprietatea poate fi ștersă sau modificată }); // Încercarea de a modifica valoarea va fi ignorată în modul ne-strict // și va arunca o eroare TypeError în modul strict obj.myProperty = 'Valoare nouă'; console.log(obj.myProperty); // Va afișa "Valoare imuabilă"Dacă setați
configurable: false, proprietatea nu poate fi ștersă sau modificată (inclusivwritable).const obj2 = {}; Object.defineProperty(obj2, 'myProperty', { value: 'Valoare imuabilă și greu de șters', writable: false, enumerable: true, configurable: false // Face descriptorul proprietății imuabil }); // Încercarea de a modifica valoarea obj2.myProperty = 'Valoare nouă'; console.log(obj2.myProperty); // Va afișa "Valoare imuabilă și greu de șters" // Încercarea de a șterge proprietatea delete obj2.myProperty; console.log(obj2.myProperty); // Va afișa "Valoare imuabilă și greu de șters" -
Utilizarea
Object.freeze():Această metodă face obiectul "înghețat". Asta înseamnă că nu se pot adăuga noi proprietăți, nu se pot șterge cele existente, nu se pot modifica valorile proprietăților existente (inclusiv enumerabilitatea și configurabilitatea lor), precum și nu se poate modifica prototipul obiectului.
const obj = { myProperty: 'Valoare imuabilă' }; Object.freeze(obj); // Încercarea de a modifica valoarea obj.myProperty = 'Valoare nouă'; console.log(obj.myProperty); // Va afișa "Valoare imuabilă" // Încercarea de a adăuga o proprietate nouă obj.newProperty = 'Nou'; console.log(obj.newProperty); // Va afișa undefined // Încercarea de a șterge proprietatea delete obj.myProperty; console.log(obj.myProperty); // Va afișa "Valoare imuabilă"Este important de menționat că
Object.freeze()este superficial. Dacă o proprietate a obiectului este alt obiect, acel obiect intern nu va fi înghețat. -
Utilizarea
constpentru variabile care conțin obiecte:Cuvântul cheie
constface referința la obiect imuabilă, dar nu și obiectul în sine. Nu veți putea reasigna variabila la un alt obiect, dar puteți modifica proprietățile obiectului.const obj = { myProperty: 'Valoare inițială' }; // Se poate modifica valoarea proprietății obj.myProperty = 'Valoare nouă'; console.log(obj.myProperty); // Va afișa "Valoare nouă" // Nu se poate reasigna variabila // obj = { altăProprietate: 'Altceva' }; // Va arunca TypeError
Comparativ între metode:
| Metodă | Ce face imuabil? | Nivel de imuabilitate |
|---|---|---|
Object.defineProperty() |
O proprietate specifică | Se definește prin descriptor |
Object.freeze() |
Întregul obiect | Superficial |
const |
Referința la obiect | Variabilă |
Alegerea metodei depinde de cât de granulară trebuie să fie imuabilitatea. Pentru o singură proprietate, se pot folosi Object.defineProperty(), pentru întregul obiect - Object.freeze(). Pentru a preveni reasignarea referinței, se folosește const.