Sobes.tech
Middle+

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. Ja true, īpašības vērtību var mainīt (obj.prop = newValue). Ja false, nevar.
    • enumerable: loģiska vērtība. Ja true, īpašība būs redzama, iterējot pa objekta īpašībām (piemēram, for...in vai Object.keys()). Parasti, false — pievienojot ar Object.defineProperty, un true — pievienojot ar parastu piešķiršanu.
    • configurable: loģiska vērtība. Ja true, deskriptora īpašības var mainīt un īpašību var dzēst. Parasti, false — pievienojot ar Object.defineProperty (izņemot value), un true — pievienojot ar parastu piešķiršanu. Ja iestatīts kā non-configurable, tas nevar tikt mainīts atpakaļ. Var samazināt writable no true uz false, bet ne pretēji, non-configurable getter/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.