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 га төмөндөтсө болот, бирок керексиз getter/setter үчүн керексиз.
  • Аксессор дескрипторлору: функцияларды аныктайт, алар мүнөздөмө алуу (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

Дескрипторлорду колдонуу объекттин мүнөздөмөлөрүн катуу көзөмөлдөөгө, мүлктөрдү өзгөртүүгө, жана объекттин жүрүм-турумун жекелештирүүгө мүмкүндүк берет.