Jak uczynić właściwość obiektu niezmienną?
sobes.tech AI
Odpowiedź od AI
Możesz uczynić właściwość obiektu niezmienną na kilka sposobów:
-
Używając
Object.defineProperty():Ta metoda pozwala na definiowanie lub modyfikowanie właściwości obiektu z bardziej szczegółową kontrolą. Aby utworzyć właściwość niezmienną, należy ustawić deskriptor właściwości na
writable: false.const obj = {}; Object.defineProperty(obj, 'myProperty', { value: 'Wartość niezmienna', writable: false, // Ustawia właściwość jako niezmienną enumerable: true, // Właściwość będzie widoczna podczas iteracji configurable: true // Właściwość może być usunięta lub zmieniona }); // Próba zmiany wartości zostanie zignorowana w trybie nieostrym // i spowoduje błąd TypeError w trybie ostrym obj.myProperty = 'Nowa wartość'; console.log(obj.myProperty); // Wyświetli "Wartość niezmienna"Jeśli ustawimy
configurable: false, właściwości nie można będzie usunąć ani zmienić jej deskriptora (w tymwritable).const obj2 = {}; Object.defineProperty(obj2, 'myProperty', { value: 'Niezmienny i niełatwy do usunięcia', writable: false, enumerable: true, configurable: false // Ustawia deskriptor właściwości jako niezmienny }); // Próba zmiany wartości obj2.myProperty = 'Nowa wartość'; console.log(obj2.myProperty); // Wyświetli "Niezmienny i niełatwy do usunięcia" // Próba usunięcia właściwości delete obj2.myProperty; console.log(obj2.myProperty); // Wyświetli "Niezmienny i niełatwy do usunięcia" -
Używając
Object.freeze():Ta metoda "zamraża" obiekt. Oznacza to, że nie można dodawać nowych właściwości, usuwać istniejących, zmieniać wartości istniejących właściwości (w tym ich enumerowalności i konfigurowalności), ani modyfikować prototypu obiektu.
const obj = { myProperty: 'Wartość niezmienna' }; Object.freeze(obj); // Próba zmiany wartości obj.myProperty = 'Nowa wartość'; console.log(obj.myProperty); // Wyświetli "Wartość niezmienna" // Próba dodania nowej właściwości obj.newProperty = 'Nowe'; console.log(obj.newProperty); // undefined // Próba usunięcia właściwości delete obj.myProperty; console.log(obj.myProperty); // "Wartość niezmienna"Warto zauważyć, że
Object.freeze()jest powierzchniowe. Jeśli właściwość obiektu jest innym obiektem, ten wewnętrzny obiekt nie zostanie zamrożony. -
Używanie
constdla zmiennych zawierających obiekty:Słowo kluczowe
constczyni odwołanie do obiektu niezmiennym, ale nie sam obiekt. Nie można przypisać zmiennej do innego obiektu, ale można zmieniać właściwości obiektu.const obj = { myProperty: 'Wartość początkowa' }; // Można zmienić wartość właściwości obj.myProperty = 'Nowa wartość'; console.log(obj.myProperty); // Wyświetli "Nowa wartość" // Nie można przypisać zmiennej do innego obiektu // obj = { innaWłaściwość: 'Inna' }; // Spowoduje błąd typu
Porównanie metod:
| Metoda | Co czyni niezmiennym? | Poziom niezmienności |
|---|---|---|
Object.defineProperty() |
Pojedyncza właściwość | Definiowane przez deskriptor |
Object.freeze() |
Cały obiekt | Powierzchniowe |
const |
Odwołanie do obiektu | Zmienna |
Wybór metody zależy od tego, jak bardzo granularna ma być niezmienność. Dla jednej właściwości odpowiednia jest Object.defineProperty(), dla całego obiektu Object.freeze(). Aby zapobiec ponownemu przypisaniu odwołania, używa się const.