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

Jiří Hrebenar
15. 3. 2010 3:28

Odpověď na dotaz Daniela Steigerwalda

Danieli, odkaz na mé články o Javascriptu nejsou žádnou reklamou, pouze jsem Vás odkazoval na článek kde je proveden správný teoretický popis, i když to může vypadat namyšleně, já reklamu nepotřebuji, denně mi na blog chodí 150 až 700 návštěvníků. Také mé výtky neberte jako nějaké naparování či vychloubání se, tak to vůbec nemyslím.

Chcete abychom Vám řekli o nedostatcích ve Vašem článku, takže za prvé, píšete: „Funkce, to je prostá definice. Není přiřazena k žádné třídě, k žádnému objektu“,
že funkce jení objektem, je chyba, funkce je objektem, přebírá některé své „vrozené“ vlastnosti z objektu Object,tudíž je přiřezena k objektu Object v Javascriptu existuje dokonce objekt jako Function , z funkce tedy můžeme vytvářet objekty.

Objekty totiž můžeme vytvářet buďto tím, že vytvoříme funkci například takto:
function funkce(){}
a tímto zápisem se obracíme na konstruktor funkce var x=new funkce();
tečkovou syntaxí se pak můžeme obracet na jednotlivé proměnné funkce, objekt také můžeme vytvářet tak, že ho vytvoříme jako asociované pole. Ovšem vytvoření objektu jako asociované pole má svá omezení. Takový objekt můžeme nazývat literálním objektem.

Tudíž tvrdit, že objekt je v Javascriptu asociované pole je špané. Dříve se objekty opravdu vytvářeli jako asociovaná pole, dnes se dají vytvořit i z funkce a je to častější způsob vytvoření. Dále pokud vytvoříte objekt z asociovaného pole tak nemůžete vytvářet novou instanci pomocí slova new.

Dále píšete, nahoře, že funkce není objekt a dole zase že je.

Dále píšete o Closure, ale všude se closure říká uzávěry. Dále se ještě jednou vrátím k objektům. Dále když už hovoříte o objektech bylo by velmi vítané kdybyste řekl, že existují vestavěné objekty, a dále že objekty si můžeme vytvořit vlastní například z funkcí nebo jako asociované pole.

Celý popis funkce máte zmatečný, za prvé z funkce můžeme vytvářet objekt, funkce obsahuje proměnné a metody a můžeme ji nazývat třídou, na třídu se můžeme odkazovat konstruktorem pomocí slůvka new. Dále objekt window je globálním nejvyšším objektem vzhledem k DOM stromu dokumentu, nikoli k samotnému Javascriptu.

Dále uvedené názvosloví je velice špatné, psát jako o špatné funkci je opravdu špatný způsob, měl byste psát o uzávěrách. Dále píšete o modulech, ve skutečnosti jde o prázdný objekt, že kterého nejde vytvářet další instance takto se skutečně dají vytvářet statické objekty.

Opět jste špatně pochopil anonymní funkce. závorky před a za anonymní funkcí se dělají kvůli poli působnosti dané funkce, kvůli ničemu jinému se nedělají.

Dále pokud se nepletu je jQuery totéž co $, a navíc se tyto proměnné dají přepsat na vlastní označení.

Prostě celý článek je nepřehledný, nedůsledný, špatné názvy, špatně jste pochopil OOP v Javascriptu, jsou zde neúplné věci......

Dále, proč bych nemohl deklarovat metodu v konstruktoru, pokud chci tuto metodu ihned zavolat tak ji tam můžu volat, nemusím ji psát jinam. Dále co se týče for in tak to skutečně nepoužívám, je to tam uvedeno pouze jako možný způsob.

Aleš Roubíček
Aleš Roubíček (neregistrovaný) ---.47.broadband3.iol.cz
15. 3. 2010 6:41

Re: Odpověď na dotaz Daniela Steigerwalda

Zkuste si ten článek přečíst ještě jednou. Daniel zde za ‚funkci‘ označuje něco co je samostatná funkce nevázaná na žádný scope (vyjma globálního) a nevolá se jako ‚konstruktor‘. Jde pouze o vysvětlení použité terminologie a proč pro jednu věc používá několik názvů.

BTW Asociované pole != asociativní pole.

peter
peter (neregistrovaný) 158.195.199.---
15. 3. 2010 9:32

Re: Odpověď na dotaz Daniela Steigerwalda

Clanok je maximalne terminologicky paskvil. Nevhodny pre zaciatocnika, lebo mu nic neda a iba ho poletie. Daniel v clanku nevysvetlil ani ako funguje operator new (mozno to sam nevie) a uz tvori objekty ako divy.

Aleš Roubíček
Aleš Roubíček (neregistrovaný) 193.165.135.---
15. 3. 2010 10:27

Re: Odpověď na dotaz Daniela Steigerwalda

OOP v JS není pro začátečníky a ani v článku nikde není nijak naznačeno, že je pro začátečníky určen.

Osobně netuším, jaké projekty za sebou mají IT odborníci peter a olin, ale Danovu práci znám a vím, že on jen málo lidí má takové znalosti JavaScriptu jako on. Tak si prosím od cesty nechce poznámky typu „možno ani nevie ako operator new funguje“.

Peter Rybar aura:14
15. 3. 2010 13:00

Re: Odpověď na dotaz Daniela Steigerwalda

> Danovu práci znám a vím, že on jen málo lidí má takové znalosti JavaScriptu jako on.

Ak je toto pravda, optom sa asi dano nevie vyjadrovat primerane svojim vedomostiam. :(

Jiří Hrebenar
15. 3. 2010 12:09

Re: Odpověď na dotaz Daniela Steigerwalda

Celé to tvrzení je mylné.

Podívejte se na následující:

function funkce(){}

document.write(ty­peof(funkce));
výsledek bude function

document.write(fun­kce.constructor);
výsledek bude Function() { [native code] }

Z tohoto jasně vyplývá, že funkce je objektem typu function, konstruktorem funkce je Function() a Function vyplývá z objektu Object.

Ovšem jiné je, když napíše, že funkci lze volat bez konstruktoru ale pokud vytvoří funkci z objektu Function tak lze funkci volat i konstruktorem.

Aichi
Aichi (neregistrovaný) ---.seznam.cz
15. 3. 2010 10:44

Re: Odpověď na dotaz Daniela Steigerwalda

Pane, výrokem

Opět jste špatně pochopil anonymní funkce. závorky před a za anonymní funkcí se dělají kvůli poli působnosti dané funkce, kvůli ničemu jinému se nedělají.

jste vaší připomínku moc neozřejmil. Když vy můžete zkratkovitě soudit, budu i já. Pokud takto zmatkovitě píšete články, tak bůh s vašimi čtenáři.

O jaké závorky vlastně jde? :)

Jiří Hrebenar
15. 3. 2010 12:14

Re: Odpověď na dotaz Daniela Steigerwalda

jde přesně o toto:

(functio(){
tělo funkce
})

ty kulaté závorky na začátku a na konci jsou zde kvůli poli působnosti

Aichi
Aichi (neregistrovaný) ---.seznam.cz
15. 3. 2010 12:20

Re: Odpověď na dotaz Daniela Steigerwalda

Můžete mi to vysvětlit? Co je podle vás pole působnosti? Ve článku se mluví o scope, je scope to co myslíte? Není náhodou scope omezen složenými závorkami, které ohraničují tělo funkce?

Jiří Hrebenar
15. 3. 2010 13:41

Re: Odpověď na dotaz Daniela Steigerwalda

Velmi rád vysvětlím.

Pole působnosti neboli anglicky Scope je trošku složitější téma než tady David nastínil.

Prakticky by se dalo říct, že pole působnosti je dáno ve funkci složenými závorkami. Pole působnosti také například řeší kdy daná funkce má přístup k proměnným další funkce.

Přístup k proměnným z jedné do druhé funkce mohou velmi krásně usnadnit uzávěry.

Nechci být opět podezříván z reklamy, ale o poli působnosti a uzávěrách si můžete přečíst v mém článku zde: http://programovani.blog.zive.cz/2009/07/rozsah-pusobnosti-v-javascriptu-a-uzavery/

Právě díky poli působnosti se doporučuje anonymní funkce uzavírat do kulatých závorek:
(function(){})

Aleš Roubíček
Aleš Roubíček (neregistrovaný) 193.165.135.---
15. 3. 2010 13:52

Re: Odpověď na dotaz Daniela Steigerwalda

Ty kulaté závorky ale nemají s polem působnosti nic společného. Z anonymní funkce se zde vytvoří objekt, který se potom dalším párem závorek zavolá.

Michal Augustýn
15. 3. 2010 14:05

Re: Odpověď na dotaz Daniela Steigerwalda

Přesně tak, kulaté závorky na to nemají vliv.

Daniel Steigerwald aura:52
15. 3. 2010 14:10

Re: Odpověď na dotaz Daniela Steigerwalda

Jmenuji se Dan, David je můj bratr ;). Nechci vás zklamat, ale to co píšete je hrubý omyl. Scope (pole působnosti, viditelnosti.. vida jak jsou ty překlady zrádné ;) generuje v Javasciptu pouze funkce. Mluvit o složených závorkách je zavádějící, generuje snad literální zápis objektu nějaký scope?

var object = {foo: 'bla'}; // hle, složené závorky, ale žádný scope ;) 

Podívejte se na tento kód:

var a = function() {
    document.title += 'a';
} ();

var b = (function() {
    document.title += 'b';
})();

var c = new function() {
    document.title += 'c';
}; 

Podstatné jsou ty kulaté závorky na konci (nebo operátor new ve třetím příkladě) Všechny příklady vytváří scope. Scope vytváří v Javascriptu funkce (nic jiného), a to pouze tak, že je funkce zavolána.
Jak vidíte, v prvním příkladu kulaté závorky nejsou, a stejně funguje. Nicméně, důrazně doporučuji závorky vždy psát, a to čistě proto, že takový kód je pak čitelnější. Už na začátku je vidět, že je funkce uzavřena do závorek, takže se s ní chystám asi něco dělat. Třetí příklad zmiňuji jen pro zajímavost, používá jej třeba Dean Edwards.
Pokud však funkci ničemu nepřiřazuji, tedy klasické:

(function() {
// ha, právě sem vytvořil nový scope
})() 

Kulaté závorky kol funkce, jsou skutečně nutné, avšak pouze kvůli syntaxi. Samy o sobě scope nevytvářejí, ani funkci nevolají.

jay
jay (neregistrovaný) ---.goldcard.cz
15. 3. 2010 11:01

Re: Odpověď na dotaz Daniela Steigerwalda

Mno, kouknul jsem se na vaše stránky a na nejnovější článek. Tedy rozhraní v jazyku, který nemá typovou kontrolu je opravdu užitečná, ale fakt užitečná věc :-)).
Jste si jistý, že víte o čem mluvíte?

Jiří Hrebenar
15. 3. 2010 11:34

Re: Odpověď na dotaz Daniela Steigerwalda

Děkuji za kritiku :),

narozdíl od Daniela mám všechny články logické, vykládající v souvislosti. O všem co tady Daniel píče tak o tom mám také články. Skutečně jeho článek je matoucí, nic neříkající. Například ta etapa s moduly, to co tam nazývá moduly jsou prázdné objekty.

Pokud o tom nevíte, tak v Javascriptu se dají nasimulovat kroky a postupy OOP, které nejsou původně v Javascriptu vytvořeny. Jedním z nich jsou jmenné prostory které ve skutečnosti jmennými prostory nejsou. Rozhraní jsou možná v Javascriptu „šílenějším“ nápadem, ale i tak se používají, první díl celkem třídílného seriálu začíná od bezvýznamného vytvoření rozhraní z komentáře, kde kontrola není možná až po rozhraní kde kontrola možná je.

Ve svých článcích se snažím lidem otevřít nový náhled na Javascript.
Opravdu vím o čem píši mám za sebou ve světě internetu bohatou zkušenost v oboru Javascriptu.

Nikoho své články nenutím číst. Pokud se vám nelíbí tak je nečtěte.

jay
jay (neregistrovaný) ---.goldcard.cz
15. 3. 2010 15:41

Re: Odpověď na dotaz Daniela Steigerwalda

Nic ve zlém, ale mě Danielův článek přijde docela pochopitelný i když nějaké nepřesnosti v něm jsou. Díky „pružnosti“ javascriptu a tomu, že není skutečně OO je ovšem i terminologie kolem něho dost pružná. Např. modul a prázdný objekt mě přijde jako stejný termínový problém jako třeba funkce a metoda.
Ale k těm rozhraním, simulovat jmenné prostory v javascriptu má určitě smysl, protože pak omezím možnost konfliktů názvů, ale k čemu mě bude rozhraní?
I pokud naimplementuje vlastní kontrolu, jestli objekt odpovídá rozhraní, tak se chyba odhalí až při běhu scriptu. Takže je to ve skutečnosti test, který se spouští při každém spustění scriptu. To mě nepřijde moc efektvní. Testy se běžně dělají jenom po změnách v programu (vím že např. v článku zmiňovaný Douglas Crockford podobné postupy taky popisuje, ale o jejich užitečnosti mě zatím nepřesvědčil).
Ale možná mě něco uniká, mohl by jste prosím vás uvést odkaz na nějakou javascriptovou knihovnu nebo framwork, kde se rozhraní používá?

MD
MD (neregistrovaný) 194.213.198.---
15. 3. 2010 16:19

Re: Odpověď na dotaz Daniela Steigerwalda

Myslim ze resenim by bylo pouzivat jiny jazyk, ktery umi rozhrani (na rozdil od javascriptu) :-)

Vít Šesták (v6ak) aura:72
15. 3. 2010 16:22

Re: Odpověď na dotaz Daniela Steigerwalda

Jo, třeba Javu díky GWT.

Peter Rybar aura:14
15. 3. 2010 16:27

Re: Odpověď na dotaz Daniela Steigerwalda

Python?

Daniel Steigerwald aura:52
15. 3. 2010 13:15

Re: Odpověď na dotaz Daniela Steigerwalda

Vy jste si ten článek prostě nepřečetl poctivě, a většinu z toho co mi vyčítáte sem nikde nenapsal. Vezmeme to popořadě, a snad se nám společně podaří najít shodu.

K druhému odstavci. Už vím, z čeho pramení vaše výtka. Vy totiž nevíte, co to znamená slovo přiřadit, anglicky assignment. Když píši „funkce není přiřazena“, rozhodně tím nemám na mysli, že funkce není potomkem Object. Je to jasné?

Ke třetímu odstavci. Opakujete pouze co sem psal. Mimochodem, kdybyste článek nečetl tak ledabyle, věděl byste, že pokud voláme funkci s operátorem new, nikdy ji nepíšeme s malým písmenem na začátku (viz váš příklad). Operátorem new totiž voláme funkci, která je konstruktorem, a konstruktory se píší vždy s velkým písmenem na začátku.

Čtvrtý odstavec. Objekt je v Javascriptu vždy asociativní pole, i kdyby jste se na hlavu stavěl. Ukažte mi jediný příklad, kdy v Javascriptu není objekt asociativním polem. Neukážete, protože žádný takový příklad neexistuje. Řekl bych, že jste si pojem asociativní pole spletl s pojmem object literal.

„Dále píšete, nahoře, že funkce není objekt a dole zase že je.“
Opět, neznáte význam slova přiřadit. Nikde sem nepsal, že funkce není objekt.

„Dále píšete o Closure, ale všude se closure říká uzávěry.“
Proč nepoužívám český pojem uzávěr, sem zmínil v úvodu. Není zažitý, a podle mého ani přesný.

Nativním (vestavěným) objektům se věnuji v dalších dílech. Nepovažuji za nutné, správné, a ani možné, zmínit v prvním díle úplně vše.

„Celý popis funkce máte zmatečný,“
Já funkce nikde nepopisuji, takže nevím co máte namysli zmatečným popisem. Pouze osvětluji, kdy se funkci jak říká, protože to je pro následující text podstatné. Dále, Objekt a modul je to samé. Jestli je, nebo není prázdný, nehraje roli.

Co se týká závorek. Vy prostě neumíte číst. Cituji sebe: „ty kulaté závorky na konci“. Co na tom nechápete? Ještě jednou: na konci. Nikde není napsáno: „Na obou koncích funkce“.

K jQuery. Vždyť právě v tom svém příkladu ukazuji, jako použít closure anonymní funkce, aby bylo možné použít bezpečně $. Nechápu, co vám na tom příkladu vadí.

No a závěrem, odpověď na vaši otázku: „Proč bych nemohl deklarovat metodu v konstruktoru“, naleznete v dalším díle. To, že si tak moc zkušený programátor, jakým bezesporu jste (a nemyslím to zle), tuto otázku vůbec klade, je mi důkazem, že mělo smysl článek napsat.

MD
MD (neregistrovaný) 194.213.198.---
15. 3. 2010 13:30

Re: Odpověď na dotaz Daniela Steigerwalda

Ke třetímu odstavci. Opakujete pouze co sem psal. Mimochodem, kdybyste článek nečetl tak ledabyle, věděl byste, že pokud voláme funkci s operátorem new, nikdy ji nepíšeme s malým písmenem na začátku (viz váš příklad). Operátorem new totiž voláme funkci, která je konstruktorem, a konstruktory se píší vždy s velkým písmenem na začátku.

V popisu javascriptu, na ktery odkazujete na zacatku clanku, se mala pismena vesele uzivaji, viz https://developer.mozilla.org/en/Core_JavaScript_1.5_Guide/Creating_New_Objects/Using_a_Constructor_Function

Daniel Steigerwald aura:52
15. 3. 2010 13:48

Re: Odpověď na dotaz Daniela Steigerwalda

No vida, mají to tam špatně. Nic není dokonalé :) O co se tedy opírá mé tvrzení? Jednak je to samotná implementace Javascriptu ve všech prohlížečích. Všechny konstrukční funkce jsou psány s velkým písmenem na začátku (Array, Object, Function, Number, Boolean atd.), stejně tak statické objekty (Math).
S malým písmenem na začátku se naopak píší všechny metody: (apply, call, toString, join, push, atd.), stejně tak všechny instance: (document, body, window, location).
Z toho také vycházejí všichni autoři Javascriptových knihoven (yui, dojo, mootools, jquery…)
Kde naopak úzus chybí, je psaní namespace. YUI preferuje PascalCase (Y.Object), Google closure vždy camelCase (goog.object).
Důvod, proč konstruktory píšeme s velkým písmenem však nespočívá pouze v tom, že to tak dělají všichni, ale také proto, že nám velké písmeno naznačuje, že bychom měli použít operátor new.
Jeden článek, v jinak velmi dobré referenční dokumentaci, na tom nic nezmění.

Aleš Roubíček
Aleš Roubíček (neregistrovaný) 193.165.135.---
15. 3. 2010 13:54

Re: Odpověď na dotaz Daniela Steigerwalda

Zkrátka jde o konvenci ne o rys jazyka. :)

Michal Augustýn
15. 3. 2010 14:07

Re: Odpověď na dotaz Daniela Steigerwalda

Ano, je to tak – constructor function jedině s velkým písmenkem na začátku! ;-)

MD
MD (neregistrovaný) 194.213.198.---
15. 3. 2010 15:04

Re: Odpověď na dotaz Daniela Steigerwalda

No dobre, jde tedy ale jen o konvenci. Syntaxe je spravna i s malymi pismeny. Z vaseho popisu to vyznivalo tak, ze mala pismena jsou uplne spatne, error.

Aleš Roubíček
Aleš Roubíček (neregistrovaný) 193.165.135.---
15. 3. 2010 15:11

Re: Odpověď na dotaz Daniela Steigerwalda

Porušování konvencí je mnohdy horší než error. Zatím co error se dá většinou dohledat a opravit, tak nedodržování konvencí je na přeshubu.

Daniel Steigerwald aura:52
15. 3. 2010 15:21

Re: Odpověď na dotaz Daniela Steigerwalda

No jistěže sem mluvil o konvenci :) Správná syntaxe, tedy funkční a spustitelný kód, může vypadat třeba i takhle: (pro pobavení) http://jsfiddle.net/VnC9v/

pk
pk (neregistrovaný) 212.47.19.---
16. 3. 2010 11:27

Re: Odpověď na dotaz Daniela Steigerwalda

Puvodni clanek mi prijde o dost srozumitelnejsi nez vase reakce :)

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