Ko tu zini par aprakstītājiem?
sobes.tech AI
Atbilde no AI
JavaScript deskriptori ir objekti, kas apraksta dažādas objekta īpašības, piemēram, tās vērtību (value), rakstīšanas iespēju (writable), pārskatāmību (enumerable) un konfigurējamību (configurable). Ir arī getter un setter deskriptori.
Ir divu veidu deskriptori:
-
Datu deskriptori: satur īpašības vērtību:
value: īpašības vērtība. Var būt jebkura derīga datu tips.writable: loģiska vērtība. Jatrue, īpašības vērtību var mainīt (obj.prop = newValue). Jafalse, nevar.enumerable: loģiska vērtība. Jatrue, īpašība būs redzama, iterējot pa objekta īpašībām (piemēram,for...invaiObject.keys()). Parasti,false— pievienojot arObject.defineProperty, untrue— pievienojot ar parastu piešķiršanu.configurable: loģiska vērtība. Jatrue, deskriptora īpašības var mainīt un īpašību var dzēst. Parasti,false— pievienojot arObject.defineProperty(izņemotvalue), untrue— pievienojot ar parastu piešķiršanu. Ja iestatīts kānon-configurable, tas nevar tikt mainīts atpakaļ. Var samazinātwritablenotrueuzfalse, bet ne pretēji,non-configurablegetter/setter.
-
Aksesora deskriptori: definē funkcijas, kas tiks izsauktas, kad īpašība tiek lasīta (getter) vai iestatīta (setter):
get: funkcija, kas tiks izsaukta, kad īpašība tiek lasīta. Šīs funkcijas rezultāts kļūst par īpašības vērtību. Neņem argumentus.set: funkcija, kas tiks izsaukta, kad īpašība tiek iestatīta. Pieņem vienu argumentu — jauno vērtību.enumerable: loģiska vērtība.configurable: loģiska vērtība.
Deskriptori nav sajaucami: īpašībai ir vai value un writable, vai get un set.
Deskriptori tiek izmantoti, lai kontrolētu objekta īpašības zemākā līmenī, nekā parastais piešķirums, īpaši ar metodēm Object.defineProperty(), Object.defineProperties(), Object.getOwnPropertyDescriptor(), Object.getOwnPropertyDescriptors(), Object.create().
Piemērs, kā izveidot īpašību ar datu deskriptori:
// Tiek izveidots tukšs objekts
const obj = {};
// Definē īpašību `name` ar datu deskriptori
Object.defineProperty(obj, 'name', {
value: 'Alice',
writable: false, // īpašību nevar mainīt
enumerable: true, // īpašība būs izvadāma
configurable: false // īpašības raksturlielumi nevar tikt mainīti, īpašība nevar tikt dzēsta
});
console.log(obj.name); // Izvadīs: Alice
// Mēģinājums mainīt īpašību (tiks ignorēts vai izraisīs kļūdu)
obj.name = 'Bob';
console.log(obj.name); // Izvadīs: Alice
// Mēģinājums dzēst īpašību (tiks ignorēts vai izraisīs kļūdu)
delete obj.name;
console.log(obj.name); // Izvadīs: Alice
Piemērs ar accessor deskriptoriem:
// Izveidojam objektu ar privātu mainīgo
const user = {
_firstName: 'John', // privāts mainīgais pēc vienošanās
_lastName: 'Doe'
};
// Definējam īpašību `fullName` ar accessor deskriptoriem
Object.defineProperty(user, 'fullName', {
get() {
// Getter: atgriež pilnu vārdu
return `${this._firstName} ${this._lastName}`;
},
set(value) {
// Setter: sadala pilnu vārdu daļās un atjaunina privātos mainīgos
const parts = value.split(' ');
this._firstName = parts[0];
this._lastName = parts[1];
},
enumerable: true, // būs izvadāms
configurable: true // raksturlielumi var tikt mainīti, īpašība var tikt dzēsta
});
console.log(user.fullName); // Izvadīs: John Doe
user.fullName = 'Peter Pan';
console.log(user._firstName); // Izvadīs: Peter
console.log(user._lastName); // Izvadīs: Pan
console.log(user.fullName); // Izvadīs: Peter Pan
Deskriptoru izmantošana ļauj izveidot nemainīgas īpašības, kavējošas aprēķina īpašības, piekļuves kontroli (getteru/setteru) un elastīgāk pārvaldīt objektu uzvedību.