Sobes.tech
Middle+

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. Agar true bo'lsa, xususiyat qiymati o'zgartirilishi mumkin (obj.prop = newValue). Standartda, false bo'lib, faqat oddiy tayinlash bilan yaratilgan ma'lumot xususiyatlari uchun true.
    • enumerable: Boolean qiymat. Agar true bo'lsa, xususiyat ob'ektning xususiyatlari bo'ylab iteratsiya paytida ko'rinadi (masalan, for...in sikli yoki Object.keys() yordamida). Standartda, Object.defineProperty bilan qo'shilgan xususiyatlar uchun false va oddiy tayinlash bilan yaratilganlar uchun true.
    • configurable: Boolean qiymat. Agar true bo'lsa, ta'riflovchining xususiyatlari (value va writable bundan mustasno) o'zgartirilishi mumkin va xususiyat o'chirilishi mumkin. Standartda, Object.defineProperty bilan qo'shilganlar uchun false (faqat value bundan mustasno) va oddiy tayinlash bilan yaratilganlar uchun true.
  • 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.