Sobes.tech
Middle

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:

  1. 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 tym writable).

    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"
    
  2. 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.

  3. Używanie const dla zmiennych zawierających obiekty:

    Słowo kluczowe const czyni 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.