რას იცი აღწერილობებზე?
sobes.tech AI
პასუხი AI-სგან
JavaScript-ში დესკრიპტორები — ეს ობიექტებია, რომლებიც აღწერენ ობიექტის სხვადასხვა თვისებებს, როგორიცაა მისი მნიშვნელობა (value), დაწერის შესაძლებლობა (writable), გადაცემა (enumerable) და კონფიგურაციის შესაძლებლობა (configurable). ასევე არსებობს getter და setter დესკრიპტორები.
არსებობს ორი ტიპის დესკრიპტორები:
-
მონაცემთა დესკრიპტორები: შეიცავს თვისების მნიშვნელობას:
value: თვისების მნიშვნელობა. შეიძლება იყოს ნებისმიერი ვალიდური მონაცემთა ტიპი.writable: ლოგიკური მნიშვნელობა. თუtrue, თვისების მნიშვნელობა შეიძლება შეიცვალოს (obj.prop = newValue). თუfalse, არ შეიძლება.enumerable: ლოგიკური მნიშვნელობა. თუtrue, თვისება გამოჩნდება ობიექტის თვისებების გადარჩევისას (მაგ.,for...inციკლში ანObject.keys()-ის გამოყენებით). ჩვეულებრივ,false—Object.defineProperty-ით დამატებულ თვისებებზე, დაtrue— ჩვეულებრივ დამატებულზე.configurable: ლოგიკური მნიშვნელობა. თუtrue, დესკრიპტორის თვისებები შეიძლება შეიცვალოს და თვისება შეიძლება წაიშალოს. ჩვეულებრივ,false—Object.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-ები) და უფრო მოქნილი მართვა ობიექტების ქცევაზე.