Devel.cz Lupa Měšec Podnikatel Root Zdroják.cz DigiZone Slunečnice Vitalia TopDrive KupDnes Navrcholu NovýTarif Dobrý web Weblogy Woko Jagg Computer.cz SK: MojeLinky

Hlavní navigace

Vlákno názorů k článku
Třídy, dědičnost a OOP v Javascriptu - I

koroptev
koroptev (neregistrovaný) 141.202.248.---
16. 3. 2010 11:25

se pridam ke kritice

1.) javascript (soucasna verzi) je hodne jednoduchy a minimalisticky jazyk, moc konceptu tam neni, proc do nej zavadet pojem „trida“, kdyz OOP system, ktery pouziva, je tzv. prototypovy a „klasicka“ OOP (dejme tomu C++ cesta) terminologie zde nedava smysl?
2.) scope je velmi jednoduchy koncept, nevynalezl ho javascript a neni na nem nic sloziteho, priklad s mercedesem v garazi se ztmavenymi okny je naproste psycho, asi jako zmrvit vtip a divat se na taktni utrpne usmevy lidi kolem
3.) closure neni jiny nazev pro scope, tak jak to chapu, je to vec implementace scope, scope rozhodne maji i jazyky, ktere closury s tou funkcionalitou, na kterou jsme zvykli z funkcionalnich jazyku, neimplementuji
4.) „V Javascriptu platí, že vše co není primitivní typ je asociativní pole, krátce objekt. Funkce je objekt..“ → vyplyva z toho, ze funkce je asociativni pole? a je?

zbytek jsem necetl, kecy nectu

David Grudl aura:74
16. 3. 2010 11:40

Re: se pridam ke kritice

ad 1) pojem třída už zaveden je a cílem článku je ho vysvětlit. Zkuste spíš zvážit, jestli je C++ skutečně ono „klasické OOP“, nebo spíš jestli neexistuje OOP v podání C++ stejně jako OOP v podání JavaScriptu. C++ je poměrně mladý jazyk, batole proti OOP.

ad 2) scope JavaScript nevynalezl. Kdo to tvrdí? Proč to vyvracíte?

ad 4)

var funkce = function() {
    alert('ahoj');
}

funkce.a = 1;
funkce.b = 2;

alert(funkce.b); // vypise 2

Ehle, je to tak, funkce je asociativní pole. Mýlil jste se, takže článek by pro vás byl velmi užitečný.

koroptev
koroptev (neregistrovaný) ---.cajvc.com
16. 3. 2010 12:06

Re: se pridam ke kritice

1.) C++ (popr. jazyky, ze kterych vychazi jeho OOP – a jejich terminologie) je starsi nez JS, „popularizoval“ li se v souvislosti s tim C++ nejaky pojem (trida napr.), je trochu hloupe, kdyz ho nekdo pozdeji ohyba, muj nazor
2.) narazel jsem na velmi neobratne vysvetleni, na tu nepruhlednou omacku + nektere komentare, ktere z toho delaji neco, co to neni, kdybych napsal „vysvetlovanim toho, co to je scope, objevujete kolo (v pripade, ze to delate neobratne za pomoci mercedesu) a nosite drivi do lesa“ bylo by to srozumitelnejsi"? Konkretne k te posledni otazce (vyvraceni) – protoze chci, prekvapive, vim, zvykejte si.
4.) nevedel jsem to, pripoustim, ze jsem spis predpokladal opak, ale proto jsem se ptal, abych se to dozvedel; ne ze by to menilo neco na tom, jakym zpusobem JS (nebo funkce v JS) pouzivam (nebo spis nepouzivam, ackoli se mi libi – kvuli neexistujici nativni implementace s nejakou relevantni mnozinou knihoven – neco jako Jscript.NET, pro ktery jsem ovsem nenalezl nejake podpurne nastroje)

muj hlavni dojem – mel-li to byt clanek o tom, kterak implementovat tridni objektovy system pomoci closures, pak to stacilo napsat, neni v tom vubec nic JS specifickeho, cili se dala vypustit cela ta omacka, mateni (pod pojmem OOP v JS si clovek asi predstavi neco jineho) a neumele vysvetlovani pojmu..

olin
olin (neregistrovaný) ---.karneval.cz
16. 3. 2010 23:46

Re: se pridam ke kritice

ad 4) Neboj se. Tvrzení, že funkce či objekt je asociativní pole, vystihuje sice na první pohled podstatu, není to ale vůbec přesné. Asociativní pole je totiž pouze datová reprezentace, zatímco objekt a funkce jsou složitější pojmy. Zůstanu proto jen u objektu, což je v JS množina vlastností (hodnot, prototypu, funkcí, konstruktorů…) – slovy OOP by se dalo říct, že obsahuje atributy a metody.

Říkat, že objekt je asociativní pole, je hodně zjednodušující (i když pro mnohé začátečníky dostačující).

Např. pro datový typ Array – navzdory tomu, že to je Object – to třeba neplatí, protože operace přiřazení (x[4]=5) nepřiřazuje pouze ke klíči 4 hodnotu 5, ale zároveň upravuje vlastnost (atribut) length.

Jiný příklad nalezneme hned u další vlastnosti JS – prototypové dědičnosti. Zde také naráží myšlenka asociativního pole, protože se při nenalezení klíče v dané instanci hledá v objektu schovaném pod klíčem prototype (pak případně i v jeho prototype a tak dále, dokud už další prototype neexistuje).

Na objekty tedy lze s jistou dávkou zjednodušení pohlížet jako na asociativní pole, je to ale velmi chytré (až vyčůrané) asociativní pole :-)

Tenhle článek obsahuje spoustu takových nepřesností. Nu což, někomu to prostě vadí, někomu ne. Já si myslím, že až bude článek kompletní, tak si v něm každý něco najde. Ten, komu vadí pletení pojmů, se může od pojmů odtrhnout a odnést si jádro věci. No a ostatní se na pojmy zas tak nekoukají, takže si odnesou to samé :-)

Peter Rybar aura:14
16. 3. 2010 12:18

Re: se pridam ke kritice

> ad 1) pojem třída už zaveden je a cílem článku je ho vysvětlit.

Prosim mohli by ste nam predviest ako zapiseme triedu v Javaskripte? Myslim skutocnu triedu/typ a nie prototyp objektu.

koroptev
koroptev (neregistrovaný) 141.202.248.---
16. 3. 2010 12:23

Re: se pridam ke kritice

to samozrejme nejde; tridni OOP lze zavest pomoci closures, jak je ukazano v clanku, coz je o dost pohodlnejsi, nez simulovat OOP v C, coz ale rovnez lze a rovnez to z C nedela objektovy jazyk alespon dle dnesnich obvyklych standardu vnimani tohoto terminu

peter
peter (neregistrovaný) 158.195.199.---
17. 3. 2010 0:19

Re: se pridam ke kritice

Kedze neexistuje trieda, nie je ziadne „triedne“. Javascript ma prototypy. Je to prototypovaci objektovy jazyk a nie triedny. Ci si Vy osobne, alebo autor clanku zavediete nejaky pojem a budete ho pouzivat na veci nic nemeni.

Daniel Steigerwald aura:52
17. 3. 2010 13:54

Re: se pridam ke kritice

Docela by mne zajímalo, jaká je Vaše definice třídy. Podělíte se s námi?

peter
peter (neregistrovaný) ---.dbp.fmph.uniba.sk
17. 3. 2010 14:25

Re: se pridam ke kritice

Ziadna definuicia triedy pre Javascript neexistuje!
Specifikacia Javascriptu ten pojem nepozna a je zbytocne sa o triedach v kontexte Javascriptu ako jazyka bavit.
Chapete? Asi nie. :(

vid. bod 1 v http://zdrojak.root.cz/clanky/oop-v-javascriptu-i/nazory/8009/

Michal Augustýn
17. 3. 2010 15:24

Re: se pridam ke kritice

Nesouhlasím. Specifikace JavaScriptu sice pojem třída nezná, ale proč bychom si ho nemohli zavést? Pojem „třída“ pro JavaScript bych přirovnal v návrhovému vzoru.
Jestli má tento „návrhový vzor“ v případě JavaScriptu smysl a je dobré ho používat, to je věc na další diskuzi…

peter
peter (neregistrovaný) ---.dbp.fmph.uniba.sk
17. 3. 2010 18:23

Re: se pridam ke kritice

Skuste napisat clanok o 3D grafike a namiesto „vertex“ pouzivat slovo „point“, namiesto „edge“ pouzivat slovo „line“ a namiesto „face“ pouzivat slovo „plane“. Asi vas za odbornika povazovat nebudu hoci ste uz co to v 3D naprogramoval.

Pojem „trieda“ je vseobecne znamy, definovany a zauzivany v jazykoch ktore triedy maju. Pretazovat pojem „trieda“ len preto, ze autor clanku nema v slovniku dost slov je nevhodne a nehodne skutocneho odbornika.
Alebo sa chcete vy, alebo autor clanku, preslavit ako vynalezca tired v jazyku, ktory triedy nema?
Ako vidite vasa originalna trminologia vyvolava iba nepokoj a vlnu nedorozumeni v diskusii.

Hovori sa: „Ak pomenujete v jazyku C parametre funkcie main inak ako argc a argv je to urazka vsetkych skutocne dobrych programatorov v jazyku C.“
Hovorit o triedach v Javascripte je nieco podobne. :(

Daniel Steigerwald aura:52
17. 3. 2010 18:57

Re: se pridam ke kritice

Tak už sem konečně hodně tu vaši správnou definici pojmu třída, ze které bude zřejmé, že Javascript třídy nemá. Nedáte-li ji sem, pak jste jenom otravný troll.

paranoiq
paranoiq (neregistrovaný) 195.70.148.---
18. 3. 2010 18:01

Re: se pridam ke kritice

Dane, nejsem žádný OOP expert. mé objektové vzdělání je omezeno pouze na C++, PHP, Python a Javu. pokud ale z těchto čtyř vyvodím nějakou definici třídy (a nechtěj prosím abych ji psal), dojdu k závěru, že JS třídy nemá (někde uvnitř hlavy mám dvě množiny „třídní OOP“ a „prototypové OOP“. nemají průnik)

pozor, to nám ale nijak nebrání třídy v JS používat! :P

když jsem kdysi poprvé zkoumal možnosti třídního OOP v JS narazij jsem na myšlenku, že třídní vlastnosti mohou být pomocí jiných prvků jazyka ‚emulovány‘. s takovou definicí jsem osobně naprosto spokojený

velice ti děkuji za článek a těším se na příští

belzebub
belzebub (neregistrovaný) ---.bohemia-regent.cz
14. 4. 2010 19:09

Re: se pridam ke kritice

Mozna je na case naucit se nejaky JINY jazyk :)

Vase argumentace je podobna tvrzeni: „Jezdil jsem uz ve Felicii, ve Fabii i v Oktavce, a vsechny mely masku chladice v podobe svislych mrizek. Proto musi byt maska chladice vzdy ze svislych mrizek“.

Michal Augustýn
18. 3. 2010 2:06

Re: se pridam ke kritice

Ale tady to asi někdo vůbec nepochopil! Šup šup, přečíst můj „názor“ ještě jednou ;-)
Já neříkám, že by se mělo místo zavedených pojmů používat něco jiného. Já říkám, že může být vhodné zavést označení pro nějakou typickou konstrukci, de facto tedy pojmenovat návrhový vzor.

V některých jazycích prostě třídy jsou v základní syntaxi (např. C#), v některých ne (např. JavaScript) a tudíž může být vhodné si to tam nějak dobastlit.

Je to podobné, jako by tu byl třeba článek „Implementace singletonu v C#“ a Vy jste tu vykřikoval, že ve specifikaci C# žádný singleton není a tudíž je úlná blbost o něčem takovém psát, že to přináší jen zmatení a že přece hlavní metoda programu by se měla jmenovat Main.

Btw. jestli jste mě chtěl oslnit svými znalostmi z počítačové grafiky, bohužel Vás musím zklamat. Vývoji herních, potažmo grafických enginů, jsem se věnoval intenzivně několik let, obhájil jsem na podobné téma diplomovou práci a i si střihnul nějakou tu přednášku na konferenci pro herní vývojáře ;-)

Daniel Steigerwald aura:52
17. 3. 2010 15:27

Re: se pridam ke kritice

Nečetl jste text pozorně, ve své otázce sem se neptal na definici Javascriptové třídy. Ptal sem se, na definici třídy jako takové. Jelikož zcela přesně víte, co třída není, podělte se prosím o vaši definici.

Zasílat nově přidané příspěvky e-mailem