Sobes.tech
Middle

Как да направите свойство на обект неизменяемо?

sobes.tech AI

Отговор от AI

Как да направите свойство на обект неизменяемо, може да се постигне по няколко начина:

  1. Използване на Object.defineProperty():

    Този метод позволява дефиниране или промяна на свойства на обект с по-фин контрол. За създаване на неизменяемо свойство трябва да зададете дескриптора на свойството с writable: false.

    const obj = {};
    Object.defineProperty(obj, 'myProperty', {
      value: 'Непроменлива стойност',
      writable: false, // Прави свойството неизменяемо
      enumerable: true, // Свойството ще бъде видимо при итерация
      configurable: true // Свойството може да бъде изтрито или променено
    });
    
    // Опит за промяна на стойността ще бъде игнориран в нестрог режим
    // и ще предизвика грешка TypeError в строг режим
    obj.myProperty = 'Нова стойност';
    console.log(obj.myProperty); // Ще изведе "Непроменлива стойност"
    

    Ако зададете configurable: false, свойството няма да може да бъде изтрито или променено (включително writable).

    const obj2 = {};
    Object.defineProperty(obj2, 'myProperty', {
      value: 'Непроменлива и трудно изтриваема',
      writable: false,
      enumerable: true,
      configurable: false // Прави дескриптора на свойството неизменяем
    });
    
    // Опит за промяна на стойността
    obj2.myProperty = 'Нова стойност';
    console.log(obj2.myProperty); // Ще изведе "Непроменлива и трудно изтриваема"
    
    // Опит за изтриване на свойството
    delete obj2.myProperty;
    console.log(obj2.myProperty); // Ще изведе "Непроменлива и трудно изтриваема"
    
  2. Използване на Object.freeze():

    Този метод прави обекта "замразен". Това означава, че не може да добавяте нови свойства, да изтривате съществуващи, да променяте стойностите на съществуващи свойства (включително тяхната изброимост и конфигурируемост), както и да променяте прототипа на обекта.

    const obj = {
      myProperty: 'Непроменлива стойност'
    };
    
    Object.freeze(obj);
    
    // Опит за промяна на стойността
    obj.myProperty = 'Нова стойност';
    console.log(obj.myProperty); // Ще изведе "Непроменлива стойност"
    
    // Опит за добавяне на ново свойство
    obj.newProperty = 'Ново';
    console.log(obj.newProperty); // undefined
    
    // Опит за изтриване на свойството
    delete obj.myProperty;
    console.log(obj.myProperty); // Ще изведе "Непроменлива стойност"
    

    Важно е да се отбележи, че Object.freeze() е повърхностен. Ако свойството на обекта е друг обект, този вътрешен обект няма да бъде замразен.

  3. Използване на const за променливи, съдържащи обект:

    Ключовата дума const прави препратката към обекта неизменяема, но не и самия обект. Не можете да пренасочите променливата към друг обект, но можете да променяте свойствата на самия обект.

    const obj = {
      myProperty: 'Начална стойност'
    };
    
    // Може да промените стойността на свойството
    obj.myProperty = 'Нова стойност';
    console.log(obj.myProperty); // "Нова стойност"
    
    // Не може да пренасочите променливата
    // obj = { другаСвойство: 'Друго' }; // Ще предизвика TypeError
    

Сравнение на методите:

Метод Какво прави неизменяемо? Ниво на неизменяемост
Object.defineProperty() Едно конкретно свойство Определя се чрез дескриптор
Object.freeze() Целия обект Повърхностен
const Препратка към обекта Променлива

Изборът на метод зависи от това, колко детайлна трябва да бъде неизменяемостта. За едно свойство е подходящо Object.defineProperty(), за цял обект - Object.freeze(). За предотвратяване на пренасочване на препратката се използва const.