Object.getOwnPropertyDescriptor / Descriptors în JavaScript

Obiecte ES5 (getOwnPropertyDescriptors: ES2017)

Returnează descriptorul unei proprietăți: valoarea și atributele writable, enumerable, configurable, get, set.

Sintaxă
Object.getOwnPropertyDescriptor(obiect, cheie)
Object.getOwnPropertyDescriptors(obiect)

Ce face Object.getOwnPropertyDescriptor / Descriptors

getOwnPropertyDescriptor arată cum este definită o proprietate proprie a obiectului (nu una moștenită). Dacă proprietatea nu există, returnează undefined.

getOwnPropertyDescriptors returnează descriptorii tuturor proprietăților proprii. Combinat cu Object.create sau Object.defineProperties, copiază corect și getter-ele și setter-ele, pe care Object.assign le transformă în valori simple. Metodele vechi __lookupGetter__ și __lookupSetter__ sunt învechite.

Parametri

Parametru Descriere
obiect Obiectul inspectat.
cheie Numele proprietății (doar pentru varianta la singular).

Ce returnează

Un descriptor sau undefined; la plural, un obiect cu descriptorii tuturor proprietăților.

Exemple

Exemplul 1: Descriptorul unei proprietăți obișnuite și al unui getter

const cont = {
  sold: 250,
  get soldFormatat() {
    return `${this.sold} lei`;
  },
};

console.log(Object.getOwnPropertyDescriptor(cont, "sold"));
console.log(Object.getOwnPropertyDescriptor(cont, "soldFormatat"));
console.log(Object.getOwnPropertyDescriptor(cont, "toString"));

Rezultat

{ value: 250, writable: true, enumerable: true, configurable: true }
{
  get: [Function: get soldFormatat],
  set: undefined,
  enumerable: true,
  configurable: true
}
undefined

Exemplul 2: Copierea corectă a getter-elor

const original = { a: 1, get dublu() { return this.a * 2; } };

const copieAssign = Object.assign({}, original);
const copieCorecta = Object.defineProperties({}, Object.getOwnPropertyDescriptors(original));

copieAssign.a = 10;
copieCorecta.a = 10;
console.log(copieAssign.dublu, copieCorecta.dublu);

Rezultat

2 20

Greșeli frecvente

  • Cauți descriptorul unei metode moștenite (de exemplu toString) direct pe obiect și primești undefined. Caută pe prototip: Object.getPrototypeOf(obiect).

Comenzi înrudite