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 // თვისება შეიძლება წაიშალოს ან შეცვალოს მისი დესკრიპტორი
    });
    
    // მნიშვნელობის შეცვლა იგნორირებულია არა მკაცრ რეჟიმში
    // და გამოიწვევს შეცდომას მკაცრ რეჟიმში
    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.