Vítejte u dalšího dílu série článku „Co byste měli vědět o JavaScriptu“. K pátemu dílu jsem seriálu nadělil vlastní štítek a také vlastní RSS.
Dnes si povíme o konstrukci with a rovnou prozradím, že
učiníte lépe, nebudete-li ji používat.
Konstrukce with
Konstrukce with je určena ke zkrácení zápisu přístupu
k vlastnostem objektů.
var osoba = {
jmeno: "franta",
prijmeni: "frantiskovec",
velikostBot: 42
};
//v rámci bloku with mohu pracovat s vlastnostmi
//objektu 'osoba' podobně jako s lokálními proměnnými
with (osoba) {
//vypíše "franta"
console.log(jmeno);
//vypíše "frantiskovec"
console.log(prijmeni);
//vypíše odpověď na základní otázku života, vesmíru a vůbec
console.log(velikostBot);
}
Zkuste si. Vypadá to užitečně, že? Ale třpyt neimplikuje zlato, jak již zajisté víme.
With nepřehledný a zrádný
Představte si, že při čtení JavaScriptového kódu narazíte na následující pasáž:
with (neco) {
olala = bubu;
}
Poznáte, co uvedený kód dělá? Stát se mohou 4 různé věci,
v závislosti na tom, zda jsou olala a bubu
vlastnostmi objektu neco.
//olala je vlastností neco, bubu nikoli neco.olala = bubu; //bubu je vlastností neco, olala nikoli olala = neco.bubu; //bubu i olala jsou vlastnostmi neco neco.olala = neco.bubu; //bubu i olala nejsou vlastnostmi neco olala = bubu;
Vzhledem k dynamické povaze JavaScriptu nemůžete nijak snadno zaručit, že objekt bude mít vámi předpokládané vlastnosti. A pokud je nemá, může zapsaná hodnota snadno skončit v globálním oboru platnosti, což lehce způsobí obtížně odladitelné chyby. Také pokud čtete cízí (nebo vlastní, ale starý) kód a předpoklad existence vlastností není vyjádřen jinak (třeba v komentáři), budete mít nejspíš problém pochopit autorův záměr.
Žijte bez with
With do JavaScriptu bezpochyby nepatří, proto byl ve
striktním módu ECMAScriptu 5 vyřazen. Ačkoliv
lze dlouze diskutovat o zajímavých použitích této konstrukce,
usnadníte si život, pokud se bez něj obejdete i vy.
„Nesnaž se znova vynalézat kolo, použij hotové
řešení.“ Jestli se alespoň trochu motáte kolem vývoje softwaru,
určitě jste již tuto mantru slyšeli nespočetněkrát.
