Reflexe (neboli reflection) v programování není zdaleka nový koncept. Reflexe odkazuje na schopnost programu se "sebe-prozkoumat" a modifikovat své vlastní struktury dynamicky, často na základě vstupu nebo podmínek, které nebyly známy při kompilaci.
Jazyky s podporou reflexe se objevily už v 60. letech. Jedním z prvních jazykl byl Lisp, který podporoval reflexivní operace a ještě dnes je považován za jeden z nejflexibilnějších jazyků, co se týče manipulace s kódem za běhu programu.
Dnes se s reflexí setkáme v některých oblastech, například
- v ORM (Object-Relational Mapping) frameworkách,
- debugování, protože vám umožní inspektovat, modifikovat a monitorovat objekty za běhu.
- testování a nástrojích pro vývoj. Nakonec, umožňuje psát kód, který je jednoduše konfigurovatelný a rozšiřitelný. To je obzvlášť důležité v moderním vývoji, kde se často používají plug-and-play architektury, moduly a rozšíření.
Reflexe v Javascriptu
JavaScript nám tedy dovoluje pomocí reflexe zkoumat a měnit vlastnosti a metody objektu. Dokonce můžeme dynamicky vytvářet nové. Reflexemi u funkcí se zabýváme v samostatném článku
Získání informací o objektu
Časté použití reflexe je v situaci, kdy se snažíme zjistit vlastnosti objektu
- zkontrolovat zda atribut objektu existuje a zda je vlastní nebo zděděný.
- Častý nástroj první volby je
Object.getOwnPropertyNames()
, který nám vrátí všechny vlastní (nezděděné) názvy vlastností objektu - Získání prototypu objektu getPrototypeOf()
- Deskriptor
Object.getOwnPropertyDescriptor(obj, prop)
pro popis atributů objektu.
Změna struktury objektu za běhu
Toto může zahrnovat přidání nových metod nebo vlastností do existujícího objektu.
-
Získává prototyp objektu
Object.setPrototypeOf(obj, prototype)
-
Object.defineProperties(obj, props)
definuje nové nebo upravuje existující vlastnosti objektu
Reflexe je mocný nástroj, ale s tím přichází i odpovědnost. Je důležité používat reflexi uváženě, protože nadměrné nebo neopatrné použití může vést k kódu, který je těžký na údržbu, méně výkonný a těžko čitelný.