Autor Zpráva
honzaik
Profil
Čau, četl jsem asi 10tutoriálů, ale ze žádného jsem pořádně nepochopil co to je objekt a k čemu se používá. Jestli znáte nějaký článek, který rozebírá objekty pro méně chápavé jak jsem já, jsem s ním. Bavím se zde o objektech v JavaScriptu, ale pravděpodobně ta základní pointa bude stejná. Děkuji
Joker
Profil
Na pochopení zrovna tohohle není Javascript ideální, protože není tak docela objektově orientovaný.
Ale na pochopení tohohle bude lepší spíš než o JS hledat články o objektově orientovaném programování, tam tyhle základní věci budou vysvětlené.

honzaik:
ze žádného jsem pořádně nepochopil co to je objekt a k čemu se používá
Když to vezmu obecně (ne konkrétně v Javascriptu), ten „objekt“ lze přirovnat k „objektu“ v reálném světě, často se to vykládá třeba s autem. Objekt je nějaká definovaná entita, jako třeba auto. Každý objekt můžeme popsat jeho vlastnostmi. Vlastnosti mohou být dvojího druhu: Buď nějaké informace o objektu (u auta třeba značka, model, barva, palivo, typ motoru, atd.), těm říkáme atributy, nebo chování objektu (obvykle popsané slovesem v rozkazovacím způsobu: Nastartuj, zrychli, brzdi, zatoč, atd.), těm říkáme metody.
Z pohledu začínajícího programátora vlastně atributy jsou něco jako objektové proměnné a metody něco jako objektové funkce. Důležité je, že objekt své vlastnosti zapouzdřuje a odděluje od okolí (podobně jako vnímáme i reálné objekty, třeba „moje auto“, „sousedovo auto“, „náš dům“, „strom“, atd.)

Tady je vidět hned několik výhod objektů. Jednak to, že „v objektech“ jsme zvyklí uvažovat i v reálném světě, což usnadňuje komunikaci mezi zadavatelem, analytikem a programátorem.
Další výhoda je právě to zapouzdření- Když chci objekt používat, nemusím se starat o jeho vnitřní fungování, stačí mi seznam jeho vlastností (tomu se říká protokol). Auto můžu řídit i bez detailní znalosti jeho fungování. Některé programovací jazyky (když odbočím od JS) mají i veřejné a soukromé vlastnosti, pak uživateli objektu stačí jen ty veřejné (auto má spoustu atributů a metod, které řidiči nijak neprezentuje a řidiče ani nezajímají).

Co ještě s objekty děláme, třídíme je na základě podobných vlastností do kategorií. Ve většině objektových jazyků existují třídy a instance (například „auto“ je třída objektů s určitými vlastnostmi. Myšlenka auta neexistuje jako objekt, ale určuje vlastnosti, které má jakékoli existující auto. Dejme tomu třeba barva, palivo, značka, model. Konkrétní exitující auto pak ty vlastnosti naplní konkrétními hodnotami, například modré benzínové Porsche Panamera - to je instance třídy auto. Zároveň ve většině objektových jazyků i třída může patřit do jiné třídy, třeba „auto“ pod „dopravní prostředek“. Podřízená třída pak automaticky získává -dědí- vlastnosti nadřízené třídy; tomu mechanismu se říká dědičnost). Javascript třídy a instance nemá, místo toho používá prototypy, pomocí kterých jde částečně realizovat i dědičnost.
honzaik
Profil
díky za vysvětlení, ale ted vlastně k čemu je ten objekt dobrý, v čem se liší od funkcí nebo proměných?
Joker
Profil
honzaik:
v čem se liší od funkcí nebo proměných?
To jsem se právě snažil popsat.
Objekt je svým způsobem sada funkcí a proměnných, které spolu nějak souvisí a tvoří nějaký zapouzdřený celek.

Vezměme třeba HTML prvek. Ten má nějaké atributy, například id, title, CSS třídu (class), pak může mít další prvky jako potomky, informace jestli je prvek aktivní, a tak dále. Dál má i nějakou funkčnost, například můžeme ho chtít nastavit jako aktivní (focus), nebo naopak opustit (blur), můžeme chtít založit nový prvek a vytvořit kopii prvku (cloneNode).
Bez objektu můžeme vytvořit proměnné elm_id, elm_title, elm_className, elm_children[], elm_active a funkce elm_focus(), elm_blur(), elm_create(), elm_cloneNode(), krom toho budeme mít třeba výšku a šířku obrazovky, scr_width, scr_height, adresu aktuální stránky- url, údaje o prohlížeči- appName, appVersion.
Takhle bychom proměnných a funkcí měli stovky a nebude jasné co s čím vlastně souvisí.
Dále HTML prvků potřebujeme mít více než jeden. Šlo by to udělat tak, že z elm_id, elm_title, elm_className a elm_active uděláme pole, z elm_children pole polí a vymyslíme způsob jak jednotlivé prvky identifikovat a následně na ně budeme odkazovat přes ten identifikátor- čili bude třeba elm_focus(idElm), elm_blur(idElm), elm_cloneNode(idElm)
Jak by fungovala například funkce create: Přidělí si volný identifikátor elementu, projde všechna atributová pole a vloží do nich příslušné hodnoty. Klonování by vypadalo tak, že elm_cloneNode() si z polí přečte údaje o prvku a pak s jejich pomocí založí nový prvek.

Tímhle způsobem by vzniklo obrovské množství globálních proměnných u kterých nebude jasné, kde všude se vlastně používají. Navíc uspořádání těch informací je nelogické- mám na jedné „hromádce“ titulky všech prvků dokumentu, na druhé „hromádce“ CSS třídy všech prvků dokumentu, na třetí „hromádce“ pro všechny prvky seznam jejich potomků, atd. Zato nemám pohromadě všechny informace o jednom konkrétním prvku, což by bylo daleko užitečnější a logičtější.
Zároveň ani z kódu není hned zřejmé jaké všechny informace a funkce se vztahují k HTML prvku.

Daleko jednodušší a lidsky pochopitelnější přístup je: HTML prvek je objekt. Má atributy (id, title, className, children) a metody (focus, blur, cloneNode a konstruktor).
Vedle toho mám objekt screen s atributy width a height. Pak mám objekt Navigator s atributy appName a appVersion.
Související informace tvoří logické celky a je hned zřejmé co k čemu patří.
Pokud chci vědět jaká funkčnost je pro HTML prvek dostupná, je to seznam jeho metod. Pokud chci vědět jaké informace o HTML prvku mám k dispozici, je to seznam jeho atributů.

Jednak jsou tedy informace o jedné entitě pěkně pohromadě, jednak každý objekt by měl pracovat jen se svými vlastnostmi, takže pak je i zřejmé, kde se s čím pracuje. Díky tomu se i omezuje množství potenciálních chyb a zjednodušuje se jejich odhalení.
honzaik
Profil
ok ale já jsem narazil na vytvoření vlastního objektu, tak na to co je ten objekt? když si ho vytvořím tak jaký to má pro mě plus oproti promenný?
_es
Profil
honzaik:
když si ho vytvořím tak jaký to má pro mě plus oproti promenný?
To je nezmyselná otázka, lebo v premennej môžeš mať číslo, textový reťazec, logickú hodnotu aj objekt.

Čau, četl jsem asi 10tutoriálů
Treba čítať pozornejšie.
honzaik
Profil
... chtělo by to nějaký jednoduchý příklad kde je potřeba vytvořit si vlastní objekt a proč... myslim že takhle slovně to nepochopim
_es
Profil
honzaik:
kde je potřeba vytvořit si vlastní objekt a proč...
Vlastné objekty v JS vytvárať nutné nie je. Všetko, čo sa dá pomocou nich, sa dá aj bez nich.
Joker
Profil
honzaik:
htělo by to nějaký jednoduchý příklad
Viz třeba Javascript této diskuse (djpw.js), hned na začátku tam je hezký příklad vytvoření objektu:
Kategorie = {
    1: {
      nazev: "Problémy v začátcích",
      ikonka: "stairs",
      kdeHledat: null,
      druh: "vývoj"
    },
    2: {
      nazev: "Názor na stránku",
      ikonka: "comment",
      kdeHledat: [],
      druh: "názory"
    },
    3: {
      nazev: "Jak něco udělat?",
      ikonka: "help",
      kdeHledat: null,
      druh: "vývoj"
    },
// a tak dále

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0