Дескрипторлор жөнүндө эмне билесиң?
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кылынса, кайра өзгөртүлбөйт.writabletrueдан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
Дескрипторлорду колдонуу объекттин мүнөздөмөлөрүн катуу көзөмөлдөөгө, мүлктөрдү өзгөртүүгө, жана объекттин жүрүм-турумун жекелештирүүгө мүмкүндүк берет.