Vlastnosti (členské proměnné) objektu mají také svoje vlastnosti (deskriptory), které nám umožňují přímo ovlivnit chování vlastností objektů 😅. V našich programech běžně definujeme vlasnosti objektů pomocí přiřazovacího operátoru (=)
obj.prop = 'Hello'
Existuje však jiný způsob bež je pomocí operátoru jak můžeme vlastnost objektu vytvořit a změnit.
Samotná hodnota vlastnosti se totiž v JS bere jako vlastnosti value
.
Můžeme také u vlastnosti nastavit writable
na false
, abychom zabránili její změně hodnoty.
Nebo můžeme nastavit vlastnost enumerable
na false, abychom skryli vlastnost při procházení objektu pomocí iterátoru.
Jak se to dělá? Pomocí metody Object.defineProperty()
, která přijímá objekt, název vlastnosti a objekt s nastavením vlastností jako poslední argument:
Object.defineProperty(obj, 'prop', {
value: 'Hello'
});
Definování nové vlastnosti
Je důležité zmínit, že existuje rozdíl, když definujeme vlastnosti objektu pomocí přiřazovacího operátoru a metodou Object.defineProperty()
.
Volání Object.defineProperty
vlastnosti nastaví jiné výchozí hodnoty - hlavně co se týče immutabily (neměnnosti).
Po nastavení vlastnosti ji už nelze změnit pomocí přiřazovacího operátoru (=) ani pomocí jiné metody.
Například:
const obj = {};
Object.defineProperty(obj, 'prop', {
value: 'Hello'
});
obj.prop = 'Goodbye'; // nezmění hodnotu vlastnosti
Object.defineProperty(obj, 'prop', {
value: 'Goodbye'
}); // nezmění hodnotu vlastnosti
Chceme-li změnit hodnotu nezměnitelné vlastnosti, musíme použít metodu Object.defineProperty()
znovu a nastavit vlastnost writable
na true
. Například:
const obj = {};
Object.defineProperty(obj, 'prop', {
value: 'Hello',
writable: true
});
obj.prop = 'Goodbye'; // změní hodnotu vlastnosti na 'Goodbye'
Object.defineProperty(obj, 'prop', {
value: 'Goodbye',
writable: true
}); // změní hodnotu vlastnosti na 'Goodbye'
Enumerable
Enumerable oblivňuje způsob, jakým je vlastnost viditelná při procházení objektu pomocí for...in
nebo Object.keys()
.
Pokud je enumerable
nastaven na false
, nebude vlastnost viditelná při procházení objektu iterátorem.
Příklad
const obj = {};
Object.defineProperty(obj, 'prop', {
value: 'hidden',
enumerable: false
});
for (let key in obj) {
console.log(key); // žádný výstup
}
console.log(Object.keys(obj)); // []
Další vlastnosti které můžeme měnit
Kromě hodnot value
a writable
, které jsme si ukázali, můžeme ovlivňovat další vlastnosti, kterými jsou
-
configurable
: Určuje, zda lze změnit vlastnostiwritable
,enumerable
aconfigurable
pomocí metodyObject.defineProperty()
. -
get
: Funkce, která se volá při čtení hodnoty vlastnosti. -
set
: Funkce, která se volá při nastavování hodnoty vlastnosti.