Jak udělat vlastnost objektu neměnnou?
sobes.tech AI
Odpověď od AI
Jak učinit vlastnost objektu nemměnnou, lze několika způsoby:
-
Použití
Object.defineProperty():Tato metoda umožňuje definovat nebo změnit vlastnosti objektu s jemnější kontrolou. Pro vytvoření neměnné vlastnosti je třeba nastavit descriptor vlastnosti na
writable: false.const obj = {}; Object.defineProperty(obj, 'myProperty', { value: 'Neměnná hodnota', writable: false, // Dělá vlastnost neměnnou enumerable: true, // Vlastnost bude viditelná při průchodu configurable: true // Vlastnost lze smazat nebo změnit její descriptor }); // Pokus o změnu hodnoty bude ignorován v ne-striktním režimu // a vyvolá chybu TypeError v striktním režimu obj.myProperty = 'Nová hodnota'; console.log(obj.myProperty); // Vypíše "Neměnná hodnota"Pokud nastavíte
configurable: false, vlastnost nebude možné smazat nebo změnit její descriptor (včetněwritable).const obj2 = {}; Object.defineProperty(obj2, 'myProperty', { value: 'Neměnná a těžko smazatelná', writable: false, enumerable: true, configurable: false // Dělá descriptor vlastnosti neměnným }); // Pokus o změnu hodnoty obj2.myProperty = 'Nová hodnota'; console.log(obj2.myProperty); // Vypíše "Neměnná a těžko smazatelná" // Pokus o smazání vlastnosti delete obj2.myProperty; console.log(obj2.myProperty); // Vypíše "Neměnná a těžko smazatelná" -
Použití
Object.freeze():Tato metoda "zamrazí" celý objekt. To znamená, že nelze přidávat nové vlastnosti, mazat existující, měnit hodnoty stávajících vlastností (včetně jejich enumerability a konfigurovatelnosti), ani měnit prototyp objektu.
const obj = { myProperty: 'Neměnná hodnota' }; Object.freeze(obj); // Pokus o změnu hodnoty obj.myProperty = 'Nová hodnota'; console.log(obj.myProperty); // Vypíše "Neměnná hodnota" // Pokus o přidání nové vlastnosti obj.newProperty = 'Nové'; console.log(obj.newProperty); // undefined // Pokus o smazání vlastnosti delete obj.myProperty; console.log(obj.myProperty); // Vypíše "Neměnná hodnota"Je důležité poznamenat, že
Object.freeze()je povrchové. Pokud je vlastnost objektu jiný objekt, tento vnitřní objekt nebude zamražen. -
Použití
constpro proměnné obsahující objekt:Klíčové slovo
constčiní odkaz na objekt neměnným, nikoliv samotný objekt. Nemůžete přenastavit proměnnou na jiný objekt, ale můžete měnit vlastnosti samotného objektu.const obj = { myProperty: 'Počáteční hodnota' }; // Může změnit hodnotu vlastnosti obj.myProperty = 'Nová hodnota'; console.log(obj.myProperty); // Vypíše "Nová hodnota" // Nelze přenastavit proměnnou // obj = { jináVlastnost: 'Jiná' }; // Vyvolá TypeError
Porovnání metod:
| Metoda | Co dělá neměnné? | Úroveň neměnnosti |
|---|---|---|
Object.defineProperty() |
Jednu konkrétní vlastnost | Definuje se pomocí descriptoru |
Object.freeze() |
Celý objekt | Povrchové |
const |
Odkaz na objekt | Proměnná |
Výběr metody závisí na tom, jak granularní má být neměnnost. Pro jednu vlastnost je vhodné Object.defineProperty(), pro celý objekt Object.freeze(). Pro zabránění přepsání odkazu se používá const.