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։