Kako učiniti svojstvo objekta nepromenjivim?
sobes.tech АИ
Одговор од АИ
Kako učiniti svojstvo objekta nemogućim za promenu može se postići na više načina:
-
Korišćenje
Object.defineProperty():Ova metoda omogućava definisanje ili modifikaciju svojstava objekta sa finijom kontrolom. Za kreiranje svojstva koje se ne može menjati, potrebno je postaviti deskriptor svojstva na
writable: false.const obj = {}; Object.defineProperty(obj, 'myProperty', { value: 'Nemoguća vrednost', writable: false, // Čini svojstvo nemogućim za promenu enumerable: true, // Svojstvo će biti vidljivo pri iteraciji configurable: true // Svojstvo može biti obrisano ili modifikovano }); // Pokušaj promene vrednosti će biti ignorisan u ne-strikt režimu // i izazvati grešku TypeError u strikt režimu obj.myProperty = 'Nova vrednost'; console.log(obj.myProperty); // Ispisaće "Nemoguća vrednost"Ako postavite
configurable: false, svojstvo se ne može obrisati ili promeniti njegov deskriptor (uključujućiwritable).const obj2 = {}; Object.defineProperty(obj2, 'myProperty', { value: 'Nemoguće i teško obrisati', writable: false, enumerable: true, configurable: false // Čini deskriptor svojstva nemogućim za promenu }); // Pokušaj promene vrednosti obj2.myProperty = 'Nova vrednost'; console.log(obj2.myProperty); // Ispisaće "Nemoguće i teško obrisati" // Pokušaj brisanja svojstva delete obj2.myProperty; console.log(obj2.myProperty); // Ispisaće "Nemoguće i teško obrisati" -
Korišćenje
Object.freeze():Ova metoda "zamrzava" ceo objekat. To znači da ne možete dodavati nove svojstva, brisati postojeća, menjati vrednosti postojećih svojstava (uključujući njihovu enumerability i konfigurabilnost), kao ni menjati prototip objekta.
const obj = { myProperty: 'Nemoguća vrednost' }; Object.freeze(obj); // Pokušaj promene vrednosti obj.myProperty = 'Nova vrednost'; console.log(obj.myProperty); // Ispisaće "Nemoguća vrednost" // Pokušaj dodavanja novog svojstva obj.newProperty = 'Novi'; console.log(obj.newProperty); // undefined // Pokušaj brisanja svojstva delete obj.myProperty; console.log(obj.myProperty); // Ispisaće "Nemoguća vrednost"Važno je napomenuti da je
Object.freeze()površno. Ako svojstvo objekta predstavlja drugi objekat, taj unutrašnji objekat neće biti zamrznut. -
Korišćenje
constza promenljive koje sadrže objekat:Ključna reč
constčini referencu na objekat nemogućom za promenu, ali ne i sam objekat. Nećete moći da preusmerite promenljivu na drugi objekat, ali možete menjati svojstva samog objekta.const obj = { myProperty: 'Početna vrednost' }; // Možete promeniti vrednost svojstva obj.myProperty = 'Nova vrednost'; console.log(obj.myProperty); // "Nova vrednost" // Nije moguće preusmeriti promenljivu // obj = { drugaSvojstvo: 'Drugo' }; // Izazvaće TypeError
Upoređenje metoda:
| Metod | Šta čini nemogućim za promenu? | Nivo nemogućnosti |
|---|---|---|
Object.defineProperty() |
Jedno konkretno svojstvo | Definiše se putem deskriptora |
Object.freeze() |
Ceo objekat | Površno |
const |
Referenca na objekat | Promenljiva |
Izbor metode zavisi od toga koliko granularno želiš da bude nemogućnost promene. Za jedno svojstvo je prikladno Object.defineProperty(), za ceo objekat Object.freeze(). Za sprečavanje preusmeravanja reference koristi se const.