Skip to content

Instantly share code, notes, and snippets.

@Kcko
Last active April 14, 2025 10:58
Show Gist options
  • Save Kcko/961d17fb8e69fc47da9c8f668a670ae1 to your computer and use it in GitHub Desktop.
Save Kcko/961d17fb8e69fc47da9c8f668a670ae1 to your computer and use it in GitHub Desktop.
// https://blog.logrocket.com/working-with-the-javascript-reflect-api/
/*
Reflect.get() - získá hodnotu vlastnosti objektu
Reflect.set() - nastaví hodnotu vlastnosti objektu
Reflect.has() - kontroluje existenci vlastnosti (podobně jako operátor in)
Reflect.deleteProperty() - odstraní vlastnost objektu
Reflect.apply() - volá funkci s danými argumenty
Reflect.construct() - vytváří nové instance objektů (podobně jako operátor new)
Reflect.getPrototypeOf() - vrací prototyp objektu
Reflect.setPrototypeOf() - nastavuje prototyp objektu
Reflect.defineProperty() - definuje novou vlastnost nebo modifikuje existující
Reflect.getOwnPropertyDescriptor() - vrací deskriptor vlastnosti
Reflect.ownKeys() - vrací pole všech vlastních klíčů objektu
*/
// Examples:
// Dynamická validace při nastavování vlastností:
// Místo obj[key] nebo obj.key, které mohou vyhodit chybu
const user = { name: "Jan" };
// Vrátí undefined místo chyby, pokud vlastnost neexistuje
// Dynamická validace při nastavování vlastností:
const user = {};
const result = Reflect.set(user, "age", 25);
console.log(result); // true - nastavení proběhlo úspěšně
// U zamrzlých objektů dostaneme false místo chyby
const target = { counter: 0 };
const handler = {
get(target, prop, receiver) {
console.log(`Čtení vlastnosti ${prop}`);
return Reflect.get(target, prop, receiver);
},
set(target, prop, value, receiver) {
console.log(`Nastavení vlastnosti ${prop} na ${value}`);
return Reflect.set(target, prop, value, receiver);
}
};
const proxy = new Proxy(target, handler);
proxy.counter = 1; // Vypíše: Nastavení vlastnosti counter na 1
console.log(proxy.counter); // Vypíše: Čtení vlastnosti counter, pak 1
//Funkcionální volání metod:
function greet(name) {
return `Ahoj, ${name}! Jsem ${this.role}.`;
}
const context = { role: "programátor" };
const result = Reflect.apply(greet, context, ["Petr"]);
console.log(result); // "Ahoj, Petr! Jsem programátor."
const frozenObj = Object.freeze({});
const frozenResult = Reflect.set(frozenObj, "name", "Jan");
console.log(frozenResult); // false (neúspěšné, ale žádná chyba)
const name = Reflect.get(user, "name"); // "Jan"
const age = Reflect.get(user, "age"); // undefined
// Dynamická konstrukce objektů:
// Místo Object.defineProperty(obj, prop, descriptor)
const success = Reflect.defineProperty(obj, "age", {
value: 30,
writable: false
});
// Získání prototypu
const proto = Reflect.getPrototypeOf(obj);
// Zjištění, zda objekt má vlastnost (čistší než 'in' operátor)
if (Reflect.has(obj, "name")) {
// Objekt obsahuje vlastnost "name"
}
// Dynamická konstrukce objektů:
class User {
constructor(name, role) {
this.name = name;
this.role = role;
}
}
// Místo použití 'new User()'
const user = Reflect.construct(User, ["Jan", "admin"]);
console.log(user.name); // "Jan"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment