Sobes.tech
Middle+

Ինչ գիտես նկարագրիչների մասին?

sobes.tech AI

Պատասխան AI-ից

Դեսքրիպտորները JavaScript-ում՝ դա օբյեկտներ են, որոնք նկարագրում են օբյեկտի տարբեր հատկություններ, ինչպիսիք են նրա արժեքը (value), գրելու հնարավորությունը (writable), ցուցակագրման հնարավորությունը (enumerable) և կոնֆիգուրացիայի հնարավորությունը (configurable): Կան նաև getter և setter դեսքրիպտորներ:

Կան երկու տեսակի դեսքրիպտորներ:

  • Տվյալների դեսքրիպտորներ: պարունակում են հատկության արժեքը:

    • value: հատկության արժեքը: կարող է լինել ցանկացած վավեր տվյալների տիպ:
    • writable: տրամաբանական արժեք: եթե true, ապա հատկության արժեքը կարող է փոխվել (obj.prop = newValue): Դեպքերում, երբ false, արժեքը չի կարող փոխվել:
    • enumerable: տրամաբանական արժեք: եթե true, ապա հատկությունը կհայտնվի օբյեկտի հատկությունների վրա անցնելու ժամանակ (օրինակ, for...in ցիկլում կամ Object.keys()-ի միջոցով):
    • configurable: տրամաբանական արժեք: եթե true, ապա դեսքրիպտորի հատկությունները կարող են փոխվել և հատկությունը կարող է հեռացվել:
  • Աքսեսոր դեսքրիպտորներ: որոշում են ֆունկցիաներ, որոնք կկոչվեն, երբ ստացվում է կամ սահմանվում է հատկության արժեքը:

    • get: ֆունկցիա, որը կկոչվի, երբ կարդացվում է հատկությունը:
    • set: ֆունկցիա, որը կկոչվի, երբ սահմանվում է հատկության արժեքը:
    • enumerable: տրամաբանական արժեք:
    • configurable: տրամաբանական արժեք:

Դեսքրիպտորները չեն կարող խառնել՝ հատկությունը կամ value և writable ունի, կամ get և set:

Դեսքրիպտորները օգտագործվում են օբյեկտի հատկությունները ավելի ցածր մակարդակով կառավարելու համար, քան սովորական նշանակումը, մասնավորապես Object.defineProperty(), Object.defineProperties(), Object.getOwnPropertyDescriptor(), Object.getOwnPropertyDescriptors(), Object.create() մեթոդների միջոցով:

Օրինակ՝ տվյալների դեսքրիպտորով հատկություն ստեղծելու համար:

// Ստեղծում ենք դատարկ օբյեկտ
const obj = {};

// Դիտարկում ենք հատկություն `name` տվյալների դեսքրիպտորով
Object.defineProperty(obj, 'name', {
  value: 'Alice',
  writable: false, // հատկությունը չի կարող փոխվել
  enumerable: true, // հատկությունը ցուցադրվող կլինի
  configurable: false // հատկության հատկանիշները չի կարելի փոխել, հատկությունը չի կարելի հեռացնել
});

console.log(obj.name); // Կցուցադրվի: Alice

// Փորձում ենք փոխել հատկությունը (կգործի միայն խիստ ռեժիմում կամ սխալ կհայտնվի)
obj.name = 'Bob';
console.log(obj.name); // Կցուցադրվի: Alice

// Փորձում ենք հեռացնել հատկությունը (կգործի կամ սխալ կհայտնվի)
delete obj.name;
console.log(obj.name); // Կցուցադրվի: Alice

Օրինակ՝ accessor դեսքրիպտորով հատկություն ստեղծելու համար:

// Ստեղծում ենք օբյեկտ՝ մասնավոր փոփոխականներով
const user = {
  _firstName: 'John', // մասնավոր փոփոխական համաձայնեցմամբ
  _lastName: 'Doe'
};

// Դիտարկում ենք հատկություն `fullName` accessor դեսքրիպտորով
Object.defineProperty(user, 'fullName', {
  get() {
    // getter: վերադարձնում է լրիվ անունը
    return `${this._firstName} ${this._lastName}`;
  },
  set(value) {
    // setter: բաժանում է լրիվ անունը մասերի և թարմացնում մասնավոր փոփոխականները
    const parts = value.split(' ');
    this._firstName = parts[0];
    this._lastName = parts[1];
  },
  enumerable: true, // հատկությունը ցուցադրվող կլինի
  configurable: true // հատկանիշները կարելի է փոխել, հատկությունը կարելի է հեռացնել
});

console.log(user.fullName); // Կցուցադրվի: John Doe

user.fullName = 'Peter Pan';
console.log(user._firstName); // Կցուցադրվի: Peter
console.log(user._lastName); // Կցուցադրվի: Pan
console.log(user.fullName); // Կցուցադրվի: Peter Pan

Դեսքրիպտորների օգտագործումը թույլ է տալիս ստեղծել անփոփոխ հատկություններ, մոռացության հատկություններ, մուտքի վերահսկման հատկություններ (getter-ներ/setter-ներ) և ավելի ճկուն կառավարել օբյեկտների վարքը։