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()-ის გამოყენებით). ჩვეულებრივ, falseObject.defineProperty-ით დამატებულ თვისებებზე, და true — ჩვეულებრივ დამატებულზე.
    • configurable: ლოგიკური მნიშვნელობა. თუ true, დესკრიპტორის თვისებები შეიძლება შეიცვალოს და თვისება შეიძლება წაიშალოს. ჩვეულებრივ, falseObject.defineProperty-ით დამატებულზე (გარდა value), და true — ჩვეულებრივ დამატებულზე. თუ non-configurable გახდება, ვერ შეიცვლება უკან. შეგიძლიათ შეამციროთ writable-ი true-დან false-მდე, მაგრამ არა პირიქით, non-configurable getter/setter-ზე.
  • Accessor დესკრიპტორები: განსაზღვრენ ფუნქციებს, რომლებიც გამოიძახებენ, როდესაც მიიღება (getter) ან დაყენება (setter) თვისების მნიშვნელობა:

    • 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-ები) და უფრო მოქნილი მართვა ობიექტების ქცევაზე.