Deskriptorlar haqida nima bilasiz?
sobes.tech AI
AIdan javob
JavaScript'da ta'riflovchilar ob'ektning turli xususiyatlarini tasvirlovchi obyektlardir, masalan, uning qiymati (value), yozish imkoniyati (writable), ro'yxatga olish imkoniyati (enumerable) va sozlash imkoniyati (configurable). Shuningdek, getter va setter bilan bo'lgan ta'riflovchilar ham mavjud.
Ikki turdagi ta'riflovchilar mavjud:
-
Ma'lumot ta'riflovchilari: Xususiyatning qiymatini o'z ichiga oladi.
value: Xususiyatning qiymati. Har qanday valid ma'lumot turida bo'lishi mumkin.writable: Boolean qiymat. Agartruebo'lsa, xususiyat qiymati o'zgartirilishi mumkin (obj.prop = newValue). Standartda,falsebo'lib, faqat oddiy tayinlash bilan yaratilgan ma'lumot xususiyatlari uchuntrue.enumerable: Boolean qiymat. Agartruebo'lsa, xususiyat ob'ektning xususiyatlari bo'ylab iteratsiya paytida ko'rinadi (masalan,for...insikli yokiObject.keys()yordamida). Standartda,Object.definePropertybilan qo'shilgan xususiyatlar uchunfalseva oddiy tayinlash bilan yaratilganlar uchuntrue.configurable: Boolean qiymat. Agartruebo'lsa, ta'riflovchining xususiyatlari (valuevawritablebundan mustasno) o'zgartirilishi mumkin va xususiyat o'chirilishi mumkin. Standartda,Object.definePropertybilan qo'shilganlar uchunfalse(faqatvaluebundan mustasno) va oddiy tayinlash bilan yaratilganlar uchuntrue.
-
Aksesyor ta'riflovchilari: Xususiyatni olish (getter) yoki o'rnatish (setter) uchun chaqiriladigan funksiyalarni belgilaydi.
get: Xususiyatni o'qish paytida chaqiriladigan funksiya. Bu funksiyaning argumentlari yo'q.set: Xususiyatga yozish paytida chaqiriladigan funksiya. Bir argument qabul qiladi, bu yangi o'rnatiladigan qiymat.enumerable: Boolean qiymat (ma'lumot ta'riflovchilarga o'xshash).configurable: Boolean qiymat (ma'lumot ta'riflovchilarga o'xshash).
Ta'riflovchilar aralashtirilmasligi kerak: xususiyatda yoki value va writable bo'ladi, yoki get va set.
Ta'riflovchilar ob'ektning xususiyatlarini pastroq darajada boshqarish uchun ishlatiladi, ayniqsa Object.defineProperty(), Object.defineProperties(), Object.getOwnPropertyDescriptor(), Object.getOwnPropertyDescriptors(), Object.create() metodlari orqali.
Ma'lumot ta'riflovchisi bilan xususiyat yaratish misoli:
// Bo'sh obyekt yaratamiz
const obj = {};
// 'name' xususiyatini ma'lumot ta'riflovchisi bilan belgilaymiz
Object.defineProperty(obj, 'name', {
value: 'Alice',
writable: false, // Xususiyat o'zgartirilmaydi
enumerable: true, // Xususiyat ro'yxatga olinadi
configurable: false // Xususiyatning xususiyatlari o'zgartirilmaydi va o'chirilmaydi
});
console.log(obj.name); // Natija: Alice
// Xususiyatni o'zgartirishga urinish (strict rejimda e'tiborsiz yoki xato chiqaradi)
obj.name = 'Bob';
console.log(obj.name); // Natija: Alice
// Xususiyatni o'chirishga urinish (e'tiborsiz yoki xato chiqaradi)
delete obj.name;
console.log(obj.name); // Natija: Alice
Aksesyor ta'riflovchisi bilan xususiyat yaratish misoli:
// Maxfiy o'zgaruvchi bilan obyekt yaratamiz
const user = {
_firstName: 'John', // Konventsiyaga ko'ra maxfiy o'zgaruvchi
_lastName: 'Doe'
};
// 'fullName' xususiyatini aksesyor ta'riflovchisi bilan belgilaymiz
Object.defineProperty(user, 'fullName', {
get() {
// Getter: to'liq ismni qaytaradi
return `${this._firstName} ${this._lastName}`;
},
set(value) {
// Setter: to'liq ismni bo'laklarga ajratadi va maxfiy o'zgaruvchilarni yangilaydi
const parts = value.split(' ');
this._firstName = parts[0];
this._lastName = parts[1];
},
enumerable: true, // Ro'yxatga olinadi
configurable: true // Xususiyat o'zgartirilishi va o'chirilishi mumkin
});
console.log(user.fullName); // Natija: John Doe
user.fullName = 'Peter Pan';
console.log(user._firstName); // Natija: Peter
console.log(user._lastName); // Natija: Pan
console.log(user.fullName); // Natija: Peter Pan
Ta'riflovchilardan foydalanish, o'zgartirilmas xususiyatlar, kechikkan hisoblash xususiyatlari, kirish nazorati (getter/setter) xususiyatlarini yaratish va ob'ektlarning xatti-harakatlarini yanada moslashuvchan boshqarish imkonini beradi.