Ako spraviť vlastnosť objektu nezmeniteľnou?
sobes.tech AI
Odpoveď od AI
Ako chcete spraviť vlastnosť objektu nemennou, môžete použiť niekoľkými spôsobmi:
-
Použitie
Object.defineProperty():Táto metóda umožňuje definovať alebo upravovať vlastnosti objektu s jemnejšou kontrolou. Na vytvorenie nemennej vlastnosti je potrebné nastaviť descriptor vlastnosti na
writable: false.const obj = {}; Object.defineProperty(obj, 'myProperty', { value: 'Nemenná hodnota', writable: false, // Robí vlastnosť nemennou enumerable: true, // Vlastnosť bude viditeľná pri prechode configurable: true // Vlastnosť môže byť odstránená alebo upravená }); // Pokus o zmenu hodnoty bude ignorovaný v ne-striktnom režime // a spôsobí chybu TypeError v striktnom režime obj.myProperty = 'Nová hodnota'; console.log(obj.myProperty); // Vypíše "Nemenná hodnota"Ak nastavíte
configurable: false, vlastnosť nebude možné odstrániť alebo upraviť jej descriptor (vrátanewritable).const obj2 = {}; Object.defineProperty(obj2, 'myProperty', { value: 'Nemenná a ťažko odstrániteľná', writable: false, enumerable: true, configurable: false // Robí descriptor vlastnosti nemenným }); // Pokus o zmenu hodnoty obj2.myProperty = 'Nová hodnota'; console.log(obj2.myProperty); // Vypíše "Nemenná a ťažko odstrániteľná" // Pokus o odstránenie vlastnosti delete obj2.myProperty; console.log(obj2.myProperty); // Vypíše "Nemenná a ťažko odstrániteľná" -
Použitie
Object.freeze():Táto metóda "zamrazí" celý objekt. To znamená, že nie je možné pridávať nové vlastnosti, odstraňovať existujúce, meniť hodnoty existujúcich vlastností (vrátane ich enumerability a konfigurovateľnosti), ako aj meniť prototyp objektu.
const obj = { myProperty: 'Nemenná hodnota' }; Object.freeze(obj); // Pokus o zmenu hodnoty obj.myProperty = 'Nová hodnota'; console.log(obj.myProperty); // Vypíše "Nemenná hodnota" // Pokus o pridanie novej vlastnosti obj.newProperty = 'Nové'; console.log(obj.newProperty); // undefined // Pokus o odstránenie vlastnosti delete obj.myProperty; console.log(obj.myProperty); // Vypíše "Nemenná hodnota"Je dôležité poznamenať, že
Object.freeze()je povrchové. Ak vlastnosť objektu predstavuje iný objekt, tento vnútorný objekt nebude zamrazený. -
Použitie
constpre premenné obsahujúce objekt:Kľúčové slovo
constrobí odkaz na objekt nemenným, ale nie samotný objekt. Nemôžete preusmerniť premennú na iný objekt, ale môžete meniť vlastnosti samotného objektu.const obj = { myProperty: 'Počiatočná hodnota' }; // Môžete zmeniť hodnotu vlastnosti obj.myProperty = 'Nová hodnota'; console.log(obj.myProperty); // "Nová hodnota" // Nie je možné preusmerniť premennú // obj = { ináVlastnosť: 'Iné' }; // Vyvolá TypeError
Porovnanie metód:
| Metóda | Čo robí nemennym? | Úroveň nemennosti |
|---|---|---|
Object.defineProperty() |
Jednu konkrétnu vlastnosť | Definuje sa pomocou deskriptora |
Object.freeze() |
Celý objekt | Povrchové |
const |
Odkaz na objekt | Premenná |
Výber metódy závisí od toho, aká granularita nemennosti je požadovaná. Pre jednu vlastnosť je vhodné Object.defineProperty(), pre celý objekt Object.freeze(). Na zabránenie preusmernenia odkazu sa používa const.