objekty v Javascriptu mohu definovat pomocí JSON notace (klíč jednotlivých parametrů může být pouze string či Symbol)
Symbol je primitivní datový typ používaný hlavně jako unikátní a neměnný identifikátor
pro definování (skrytých) klíčů v objektech
const sym1 = Symbol('id');
mohu si definovat svoje vlastní custom properties (pomocí defineProperty)
informace o nich dostanu pomocí deskriptorů (pomocí getDescriptorForProperty)
mohu jim nastavovat writeable či enumerable a pak určitě způsoby get a set
dědičnost
pomocí řetězce prototypů
objekt může mít skrytý odkaz na svůj prototyp a pokud se volá property nebo funkce na objektu a není tam, tak se JS automaticky podívá jeho prototyp (a popř. na prototyp prototypu atd.)
jako getter/setter se používá __proto__ (starší) nebo getPrototypeOf či setPrototypeOf (novější)
na .prototype mohu definovat objekty či metody, které chci mít uložené na prototypu nově vytvořeného objektu
je možné také vytvářet objekty přes Object.create(prototype) rovnou s přiřazením prototypu
od ECMAskriptu jsou definované i třídy (class), ale je to jenom syntaktický cukr pro prototypy (třída je vlastně taková velká funkce v JS, také je to syntaktický sugar)
máme class variables a class functions
používám class, extends a super - pro zavolání konstruktoru předka
parametry a metody objektů se dělí na “own” a “inherited”
this a kontext
this reprezentuje kontext provádění objektu či funkce, ve kterém je volán
globálně
ve sloppy (default) režimu je to window či global
ve strict režimu je undefined
v objektu
má kontext toho objektu a mohu se tak dostat k aktuálním properties či funkcím
ve funkci
záleží, kde ta funkce je, pokud je na globálu, tak je tam hodnota podle sloppy/strict režimu
ve funkci v rámci objektu je tam kontext toho objektu
v arrow funkci nemá kontext, vždy přebírá z vnějšího kontextu
pokud je to arrow funkce zabalená do function () {}, tak pak přebírá kontext této funkce