<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Martin Cohen: Blog</title>
	
	<link>http://coh.io/blog</link>
	<description>Intype, dizajn, vývoj a somári</description>
	<lastBuildDate>Mon, 18 Jul 2011 12:52:07 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/MartinCohen-Blog" /><feedburner:info uri="martincohen-blog" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><creativeCommons:license>http://creativecommons.org/licenses/by-nc-nd/3.0/</creativeCommons:license><image><link>http://creativecommons.org/licenses/by-nc-nd/3.0/</link><url>http://creativecommons.org/images/public/somerights20.gif</url><title>Some Rights Reserved</title></image><feedburner:emailServiceId>MartinCohen-Blog</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><item>
		<title>Blog v angličtine [Nezaradené]</title>
		<link>http://feedproxy.google.com/~r/MartinCohen-Blog/~3/TzK44xKcNvI/1209-blog-v-anglictine</link>
		<comments>http://coh.io/blog/1209-blog-v-anglictine#comments</comments>
		<pubDate>Mon, 18 Jul 2011 12:52:07 +0000</pubDate>
		<dc:creator>Martin Cohen</dc:creator>
				<category><![CDATA[Nezaradené]]></category>

		<guid isPermaLink="false">http://coh.io/blog/?p=1209</guid>
		<description><![CDATA[
<p>Rozhodol som sa to skúsiť po anglicky na blog.coh.io.</p>

<!-- by Texy2! -->]]></description>
			<content:encoded><![CDATA[
<p>Rozhodol som sa to <a href="http://blog.coh.io/">skúsiť po anglicky na
blog.coh.io</a>.</p>

<!-- by Texy2! -->
<p><a href="http://feedads.g.doubleclick.net/~a/Ma2XLo4Y3XuFBIHNSkuD-WqN-dk/0/da"><img src="http://feedads.g.doubleclick.net/~a/Ma2XLo4Y3XuFBIHNSkuD-WqN-dk/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/Ma2XLo4Y3XuFBIHNSkuD-WqN-dk/1/da"><img src="http://feedads.g.doubleclick.net/~a/Ma2XLo4Y3XuFBIHNSkuD-WqN-dk/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/MartinCohen-Blog?a=TzK44xKcNvI:ohy2k03-5Pk:Q_R_9tvTlBE"><img src="http://feeds.feedburner.com/~ff/MartinCohen-Blog?d=Q_R_9tvTlBE" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/MartinCohen-Blog?a=TzK44xKcNvI:ohy2k03-5Pk:S_tNKX4Mz-g"><img src="http://feeds.feedburner.com/~ff/MartinCohen-Blog?d=S_tNKX4Mz-g" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/MartinCohen-Blog/~4/TzK44xKcNvI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://coh.io/blog/1209-blog-v-anglictine/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://coh.io/blog/1209-blog-v-anglictine</feedburner:origLink></item>
		<item>
		<title>Sága o inštalácii YUIDoc [Web]</title>
		<link>http://feedproxy.google.com/~r/MartinCohen-Blog/~3/zvOrqH78Wc0/1190-saga-o-instalacii-yuidoc</link>
		<comments>http://coh.io/blog/1190-saga-o-instalacii-yuidoc#comments</comments>
		<pubDate>Fri, 21 May 2010 13:09:47 +0000</pubDate>
		<dc:creator>Martin Cohen</dc:creator>
				<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://coh.io/blog/?p=1190</guid>
		<description><![CDATA[
<p>Ani som nechcel tento článok napísať, lebože iba keď si tým obhyzdným
peklom jeden prejde, pochopí že stav alarmujúci jest.</p>

<p>YUIDoc je semä hada britského, čiže potrebujete Python. Okrem toho jačí
po 4 daľších knižniciach. Bez command prompt cez nasledovné
neprejdete.</p>

<p>Python 2.6</p>

<p>Stiahnite si Python 2.6.5 Windows<br />
installer</p>

<p>Nainštalujte. Doporučujem nemeniť cieľovú cestu a horko prijať čo
má<br />
inštalátor prednastavené, inak sa môžete dostať do slušných<br />
sračiek.</p>

<p>Do PATH […]</p>

<!-- by Texy2! -->]]></description>
			<content:encoded><![CDATA[
<p>Ani som nechcel tento článok napísať, lebože iba keď si tým obhyzdným
peklom jeden prejde, pochopí že stav alarmujúci jest.</p>

<p><a href="http://developer.yahoo.com/yui/yuidoc/">YUIDoc</a> je semä hada
britského, čiže potrebujete <em>Python</em>. Okrem toho jačí po
4 daľších knižniciach. Bez <em>command prompt</em> cez nasledovné
neprejdete.</p>

<h2>Python 2.6</h2>

<ol>
	<li>Stiahnite si <a href="http://www.python.org/download/">Python 2.6.5 Windows
	installer</a></li>

	<li>Nainštalujte. Doporučujem nemeniť cieľovú cestu a horko prijať čo má
	inštalátor prednastavené, inak sa môžete dostať do slušných
	sračiek.</li>

	<li>Do <code>PATH</code> si pridajte <code>C:\Python26</code> a
	<code>C:\Python26\Scripts</code>.</li>
</ol>

<h2>setuptools</h2>

<p><code>setuptools</code> je balíček, ktorý zjednodušuje sťahovanie a
inštaláciu ostatných balíčkov pre Python.</p>

<ol>
	<li>Stiahnite si <a
	href="http://pypi.python.org/pypi/setuptools#files">setuptools-0.6c11.win32-py2.6.exe</a>.
	Bacha aby ste fakt stiahli verziu py2.6, inak budú problémy.</li>

	<li>Nainštalujte.</li>
</ol>

<h2>Ostatné závislosti pre YUIDoc</h2>

<ol>
	<li>Spustite <em>command prompt</em> a postupne nainštalujte každý
	z nasledujúcich balíčkov. Pokiaľ by vám systém protestoval, že použitý
	<code>easy_install</code> nevie nájsť, skúste nasledové spúšťať
	z adresára <code>C:\Python26\Scripts</code>.</li>

	<li><code>easy_install Pygments</code></li>

	<li><code>easy_install SimpleJSON</code></li>

	<li><code>easy_install Cheetah</code></li>
</ol>

<p>Mne v bode 4. <code>Cheetah</code> zlyhal na tom, že si nevedel nájsť
práve stiahnutý inštalátor pre <code>Markdown</code>:</p>

<pre>...
Downloading http://sourceforge.net/projects/python-markdown/files/markdown/2.0.3/Markdown-2.0.3.win32.exe/download
Processing download
error: Couldn't find a setup script in c:\docume~1\martin~1.bal\locals~1\temp\easy_install-ad29ft\download</pre>

<p>Pre istotu som teda <a
href="http://sourceforge.net/projects/python-markdown/files/">Markdown
stiahol</a> a nainštaloval samostatne. Sám netuším či to má význam.</p>

<h2>YUIDoc</h2>

<p><a href="http://yuilibrary.com/downloads/#yuidoc">Stiahnite si YUI Doc</a>.
Niekam ho rozbaľte (ideálne keď cesta nebude obsahovať medzery v názvoch
súborov). Ja mám napríklad adresár <code>D:\work\libraries</code> kde mám
rôzne podobné taľafatky. Z neho mám urobený samostatný disk takto:</p>

<pre>subst L: D:\work\libraries</pre>

<p>Baťák sa mi spúšťa po štarte, takže <code>L:</code> mám vždy
po ruke.</p>

<p><em>YUIDoc</em> má v sebe ukážkový spúšťačno-konfigurujúci
<code>L:\yuidoc\bin\example.bat</code> ktorý si je potrebné niekam
skopírovať a upraviť podľa potreby. A pretože <em>YUIDoc</em> vo verzii
<em>1.0.0b1</em> používa <em>deprecated</em> modul <em>Sets</em> som si urobil
ešte malú úpravu na poslednom riadku, ktorá zakáže veselé
<em>DeprecatedWarning</em> ňuf-ňuf správičky. Tu máte môj
<code>generate.bat</code>:</p>

<pre>
@ECHO OFF

REM ##########################################################################

REM The location of your yuidoc install
<strong>SET yuidoc_home="l:\yuidoc"</strong>

REM The location of the files to parse.  Parses subdirectories, but will fail if
REM there are duplicate file names in these directories.  You can specify multiple
REM source trees:
REM      SET parser_in="c:\home\www\yahoo.dev\src\js c:\home\www\Event.dev\src"
<strong>SET parser_in=""</strong>

REM The location to output the parser data.  This output is a file containing a
REM json string, and copies of the parsed files.
<strong>SET parser_out="..\..\temp\doc"</strong>

REM The directory to put the html file outputted by the generator
<strong>SET generator_out="..\..\dist\doc"</strong>

REM The location of the template files.  Any subdirectories here will be copied
REM verbatim to the destination directory.
<strong>SET template="%yuidoc_home%\template"</strong>

REM The project version that will be displayed in the documentation.
<strong>SET version="1.0.0"</strong>

REM The version of YUI the project uses.
<strong>SET yuiversion="2"</strong>

<strong>python -W ignore::DeprecationWarning %yuidoc_home%\bin\yuidoc.py %parser_in% -p %parser_out% -o %generator_out% -t %template% -v %version% -Y %yuiversion%</strong>
</pre>

<p>Popis jednotlivých parametrov je v dodávke celkom jasný. Pre úplnosť
uvediem ešte štruktúru môjho projektu:</p>

<ul>
	<li><code>dev\js</code> Obsahuje moje JS súbory a aj uvedený
	<code>generate.bat</code>, ktorý z toho adresára spúšťam (bacha, uvedené
	cesty sú relatívne k tomuto adresáru).</li>

	<li><code>dist\doc</code> Sem sa mi vyleje dokumentácia v HTML.</li>

	<li><code>temp\doc</code> Sem tratí <em>YUIDoc</em> dočasné súbory.</li>
</ul>

<p>Mľaskavo vychutnávajte.</p>

<!-- by Texy2! -->
<p><a href="http://feedads.g.doubleclick.net/~a/9u_dlIsl1YigflUTgK0lKydWS2s/0/da"><img src="http://feedads.g.doubleclick.net/~a/9u_dlIsl1YigflUTgK0lKydWS2s/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/9u_dlIsl1YigflUTgK0lKydWS2s/1/da"><img src="http://feedads.g.doubleclick.net/~a/9u_dlIsl1YigflUTgK0lKydWS2s/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/MartinCohen-Blog?a=zvOrqH78Wc0:nx1SzlnI9go:Q_R_9tvTlBE"><img src="http://feeds.feedburner.com/~ff/MartinCohen-Blog?d=Q_R_9tvTlBE" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/MartinCohen-Blog?a=zvOrqH78Wc0:nx1SzlnI9go:S_tNKX4Mz-g"><img src="http://feeds.feedburner.com/~ff/MartinCohen-Blog?d=S_tNKX4Mz-g" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/MartinCohen-Blog/~4/zvOrqH78Wc0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://coh.io/blog/1190-saga-o-instalacii-yuidoc/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://coh.io/blog/1190-saga-o-instalacii-yuidoc</feedburner:origLink></item>
		<item>
		<title>A kam zálohujete vy? [Nezaradené]</title>
		<link>http://feedproxy.google.com/~r/MartinCohen-Blog/~3/GCzdQzhhx_s/1187-a-kam-zalohujete-vy</link>
		<comments>http://coh.io/blog/1187-a-kam-zalohujete-vy#comments</comments>
		<pubDate>Tue, 11 May 2010 08:56:51 +0000</pubDate>
		<dc:creator>Martin Cohen</dc:creator>
				<category><![CDATA[Nezaradené]]></category>

		<guid isPermaLink="false">http://coh.io/blog/?p=1187</guid>
		<description><![CDATA[
<p>Od víkendu sa snažím si zazálohovať. Môj problém je, že súčasťou
záloh je rákoš malých súborov (práca) a stádko veledôležitých
veľkých súborov (2GB+).</p>

<p>Pochopiteľne som väčšinu toho vypálil na DVD, ale keďže mi tie
staršie akosi zahnedli, predstavujú pravdepodobnosť straty iba o blšku
nižšiu. Externé hard-disky sú tiež kazové, drahé a nepraktické.
I siahol som po online riešení.</p>

<p>Prvé 4 dni som sa pokúšal pretlačiť […]</p>

<!-- by Texy2! -->]]></description>
			<content:encoded><![CDATA[
<p>Od víkendu sa snažím si zazálohovať. Môj problém je, že súčasťou
záloh je rákoš malých súborov (práca) a stádko veledôležitých
veľkých súborov (2GB+).</p>

<p>Pochopiteľne som väčšinu toho vypálil na DVD, ale keďže mi tie
staršie akosi zahnedli, predstavujú pravdepodobnosť straty iba o blšku
nižšiu. Externé hard-disky sú tiež kazové, drahé a nepraktické.
I siahol som po online riešení.</p>

<p>Prvé 4 dni som sa pokúšal pretlačiť dáta na <a
href="http://aws.amazon.com/s3/">Amazon S3</a> – zdanlivo výhodná cena a
dostupnosť nástrojov. Veľké súbory sa mi však pretlačiť nepodarilo a
pokusy o nový upload po každom zakolísaní spojenia človeka od nervov
obkrúti o nohu stola. Skončilo to zmazaním bucketu a hľadadím
alternatívy.</p>

<p>Priznám sa, že <a
href="https://www.google.com/accounts/PurchaseStorage">Storage od Brata</a>
nechcem.</p>

<p>Vyískal som <a href="http://mozy.com">mozy.com</a>, neradno však písať
predčasné závery. Veľké súbory to tiež moc nepožralo, ale aspoň tie
100MB rozrezky to, zdá sa, chrumká. Až to dopadne, napíšem.</p>

<p>A kam zálohujete vy?</p>

<!-- by Texy2! -->
<p><a href="http://feedads.g.doubleclick.net/~a/tDIthe1BEHwDoNHaryZSl-XCoF4/0/da"><img src="http://feedads.g.doubleclick.net/~a/tDIthe1BEHwDoNHaryZSl-XCoF4/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/tDIthe1BEHwDoNHaryZSl-XCoF4/1/da"><img src="http://feedads.g.doubleclick.net/~a/tDIthe1BEHwDoNHaryZSl-XCoF4/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/MartinCohen-Blog?a=GCzdQzhhx_s:lyjM7eT4Fto:Q_R_9tvTlBE"><img src="http://feeds.feedburner.com/~ff/MartinCohen-Blog?d=Q_R_9tvTlBE" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/MartinCohen-Blog?a=GCzdQzhhx_s:lyjM7eT4Fto:S_tNKX4Mz-g"><img src="http://feeds.feedburner.com/~ff/MartinCohen-Blog?d=S_tNKX4Mz-g" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/MartinCohen-Blog/~4/GCzdQzhhx_s" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://coh.io/blog/1187-a-kam-zalohujete-vy/feed</wfw:commentRss>
		<slash:comments>11</slash:comments>
		<feedburner:origLink>http://coh.io/blog/1187-a-kam-zalohujete-vy</feedburner:origLink></item>
		<item>
		<title>JavaScript zvnútra 1/4: Dedičnosť objektov [Web]</title>
		<link>http://feedproxy.google.com/~r/MartinCohen-Blog/~3/uTPcJkVeaRg/1048-javascript-zvnutra-14-dedicnost-objektov</link>
		<comments>http://coh.io/blog/1048-javascript-zvnutra-14-dedicnost-objektov#comments</comments>
		<pubDate>Tue, 04 May 2010 14:00:18 +0000</pubDate>
		<dc:creator>Martin Cohen</dc:creator>
				<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://coh.io/blog/?p=1048</guid>
		<description><![CDATA[
<p>Veľa zmätku nastalo okolo JavaScriptu. Jeho neobyčajné vlastnosti veľa
nás radšej ignoruje, akoby mali pariť uzlinami. Našli sme si miesto toho
zázračné formulky, ktoré nám pomáhajú priepasť prekonávať. Navyše,
množstvo zdrojov uvádza nekompletné, či dokonca nesprávne postupy.
Špecifikácia nie je veľkým pomocníkom a k tomu všetkému sú tu rozdiely
medzi implementáciami.</p>

<p>Všetci vieme:</p>

<p>JavaScript má prototypovú dedičnost.</p>

<p>Na dedenie je vlastnosť prototype.</p>

<p>Na inštancovanie objektu […]</p>

<!-- by Texy2! -->]]></description>
			<content:encoded><![CDATA[
<p>Veľa zmätku nastalo okolo JavaScriptu. Jeho neobyčajné vlastnosti veľa
nás radšej ignoruje, akoby mali pariť uzlinami. Našli sme si miesto toho
<em>zázračné formulky,</em> ktoré nám pomáhajú priepasť prekonávať.
Navyše, množstvo zdrojov uvádza nekompletné, či dokonca nesprávne postupy.
Špecifikácia nie je veľkým pomocníkom a k tomu všetkému sú tu rozdiely
medzi implementáciami.</p>

<p>Všetci vieme:</p>

<ul>
	<li>JavaScript má prototypovú dedičnost.</li>

	<li>Na dedenie je vlastnosť <code>prototype</code>.</li>

	<li>Na inštancovanie objektu používame funkcie, ktoré sa podobajú ako na
	triedy, tak na konštruktory.</li>
</ul>

<p>a strácame sa:</p>

<ul>
	<li>Čo je to prototypová dedičnost?</li>

	<li>Akú úlohu hrá vlastnosť <code>prototype</code> v dedičnosti?</li>

	<li>Ako funguje inštancovanie objektu z konštruktora?</li>
</ul>

<h2>Dedičnosť medzi objektami</h2>

<p>Prototypová dedičnost, byť termín nesprávny, vhodný sťa metafora jest.
(Používať budem i termíny ako napríklad „trieda“, ktoré nie sú tak
celkom správne v kontexte JavaScriptu).</p>

<p>Na spodku zázrakov JavaScriptu je dedičnosť medzi objektami (nemýliť
s triedami). Na to aby sme pochopili ako funguje dedenie tried, je dobré
vedieť ako môže jeden objekt dediť od druhého. Príklad:</p>

<pre class="js"><code><span class="js-keywords1">var</span><span
class="js-out"> fruit = { taste: </span><span
class="js-quote">&quot;sweet&quot;</span><span class="js-out"> };
</span><span
class="js-keywords1">var</span><span
class="js-out"> apple = { color: </span><span
class="js-quote">&quot;red&quot;</span><span class="js-out"> };

</span><span
class="js-comment">// Čil z&aacute;zrak snaň sa!
</span><span
class="js-out">
alert( apple.taste ); </span><span
class="js-comment">// =&gt; &quot;sweet&quot;</span></code></pre>

<p>Zázrak, ktorý sa musí stať je prepojenie objektov <code>apple</code> a
<code>fruit</code>. Čiže ak sa spýtam na <code>apple.taste</code>, JavaScript
musí vedieť, že ak <code>taste</code> nie je definovaná pre
<code>apple</code> tak sa musí pozrieť na <code>fruit</code>.</p>

<p>Existuje vlastnosť každého objektu v JavaScripte, o ktorej nám
súčasné implementácie viac-menej mlčia. Všetci sme už počuli
o vlastnosti <code>prototype</code>, málo je však počut o
<code>__proto__</code>. Je to preto, že <code>__proto__</code> je
v špecifikácii <a href="http://www.ecmascript.org/">ECMAScript
262</a> označená ako interná (skrytá) a nemali by sme teda na ňu ako
programátori šahať. (Špecifikácia hovorí o tejto vlastnosti ako o
<code>[[Prototype]]</code>).</p>

<p>I napriek tomu dve JavaScriptové implementácie (<a
href="http://www.mozilla.org/js/spidermonkey/">SpiderMonkey od Mozilly</a> a <a
href="http://code.google.com/p/v8/">V8 od Google</a>) ju sprístupňujú a
pomenúvajú <code>__proto__</code> (budem teda používať toto pomenovanie).
<strong>Rád by som tu zdôraznil, že ide o neštandardnú internú
vlastnosť, ale nám veľmi dobre poslúži na pochopenie toho čo sa
v JavaScripte de­je.</strong></p>

<p>Oný zázrak je teda v tom, že <code>apple.__proto__</code> nastavíme na
<code>fruit</code>:</p>

<pre class="js"><code><span class="js-keywords1">var</span><span
class="js-out"> fruit = { taste: </span><span
class="js-quote">&quot;sweet&quot;</span><span class="js-out"> };
</span><span
class="js-keywords1">var</span><span
class="js-out"> apple = { color: </span><span
class="js-quote">&quot;red&quot;</span><span
class="js-out"> };

apple.__proto__ = fruit;

alert( apple.taste ); </span><span
class="js-comment">// =&gt; &quot;sweet&quot;</span></code></pre>

<p><a href="http://jsfiddle.net/zbqPV/"> → Vyskúšajte</a></p>

<div><img src="http://coh.io/blog/wp-content/uploads/JavaScript-1-1.png" alt=""
/></div>

<p>Objekt <code>apple</code> dedí od <code>fruit</code>, vďaka vlastnosti
<code>__proto__</code>. Ak sa spýtame na hodnotu vlastnosti <code>taste</code>,
JavaScript sa ju pokúsi nájsť na objekte <code>apple</code>. Ak ju objekt
<code>apple</code> nemá, mrkne sa do objektu <code>apple.__proto__</code>, ak
ani tam nič, tak <code>apple.__proto__.__proto__</code>atď. V našom prípade
sa zastaví na <code>apple.__proto__</code>, pretože ukazuje na objekt
<code>fruit</code> a ten vlastnosť <code>taste</code> má.</p>

<p>Ak chcem objektu <code>apple</code> zmeniť chuť na <code>"sour"</code>,
nič mi nebráni. Objekt <code>fruit</code> bude stále sladký:</p>

<pre class="js"><code><span class="js-out">apple.taste = </span><span
class="js-quote">&quot;sour&quot;</span><span
class="js-out">;
alert( apple.taste ); </span><span
class="js-comment">// =&gt; &quot;sour&quot;
</span><span
class="js-out">alert( fruit.taste ); </span><span
class="js-comment">// =&gt; &quot;sweet&quot;</span></code></pre>

<p><a href="http://jsfiddle.net/WWx6H/"> → Vyskúšajte</a></p>

<div><img src="http://coh.io/blog/wp-content/uploads/JavaScript-1-2.png" alt=""
/></div>

<p>V tomto momente <code>apple</code> dostáva vlastný <code>taste</code> a
JavaScript už nemusí snoriť po <code>__proto__</code> aby ju našiel.</p>

<p>Je dôležité si uvedomiť, že s <code>__proto__</code> sa za normálnych
okolností nestretneme. Budeme dokonca nútení ho nepoužívať, pretože nie
je definovaný vo všetkých implementáciách. V tejto sérii slúži hlavne
na vysvetlenie vnútorných pochodov v JavaScripte.</p>

<p>Ďalšia časť:</p>

<ul>
	<li><strong>JavaScript zvnútra 1/4: Dedičnosť objektov</strong></li>

	<li><a
	href="http://coh.io/blog/1062-javascript-zvnutra-24-konstruktory">JavaScript
	zvnútra 2/4: Konštruktory</a></li>

	<li><a
	href="http://coh.io/blog/1064-javascript-zvnutra-34-prototyp-konstruktora">JavaScript
	zvnútra 3/4: Prototyp konštruktora</a></li>

	<li><a
	href="http://coh.io/blog/1065-javascript-zvnutra-44-dedicnost-medzi-triedami">JavaScript
	zvnútra 4/4: Dedičnosť medzi triedami</a></li>
</ul>

<!-- by Texy2! -->
<p><a href="http://feedads.g.doubleclick.net/~a/9rAckvWUQTuyUN-Q9VVg8KjI3V0/0/da"><img src="http://feedads.g.doubleclick.net/~a/9rAckvWUQTuyUN-Q9VVg8KjI3V0/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/9rAckvWUQTuyUN-Q9VVg8KjI3V0/1/da"><img src="http://feedads.g.doubleclick.net/~a/9rAckvWUQTuyUN-Q9VVg8KjI3V0/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/MartinCohen-Blog?a=uTPcJkVeaRg:oJ5DSuJQPFo:Q_R_9tvTlBE"><img src="http://feeds.feedburner.com/~ff/MartinCohen-Blog?d=Q_R_9tvTlBE" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/MartinCohen-Blog?a=uTPcJkVeaRg:oJ5DSuJQPFo:S_tNKX4Mz-g"><img src="http://feeds.feedburner.com/~ff/MartinCohen-Blog?d=S_tNKX4Mz-g" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/MartinCohen-Blog/~4/uTPcJkVeaRg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://coh.io/blog/1048-javascript-zvnutra-14-dedicnost-objektov/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://coh.io/blog/1048-javascript-zvnutra-14-dedicnost-objektov</feedburner:origLink></item>
		<item>
		<title>JavaScript zvnútra 2/4: Konštruktory [Web]</title>
		<link>http://feedproxy.google.com/~r/MartinCohen-Blog/~3/fegTzjL-fzw/1062-javascript-zvnutra-24-konstruktory</link>
		<comments>http://coh.io/blog/1062-javascript-zvnutra-24-konstruktory#comments</comments>
		<pubDate>Tue, 04 May 2010 13:00:42 +0000</pubDate>
		<dc:creator>Martin Cohen</dc:creator>
				<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://coh.io/blog/?p=1062</guid>
		<description><![CDATA[
<p>Tento článok je pokračovaním série o dedičnosti v JavaScripte:</p>

<p>JavaScript<br />
zvnútra 1/4: Dedičnosť objektov</p>

<p>JavaScript zvnútra 2/4: Konštruktory</p>

<p>JavaScript<br />
zvnútra 3/4: Prototyp konštruktora</p>

<p>JavaScript<br />
zvnútra 4/4: Dedičnosť medzi triedami</p>

<p>Predsa však, bežnejšia, dostupnejšia a bezpečnejšia forma dedičnosti
ako tá čisto objektová je pomocou konštruktorov. Kým sa dostanem
k samotnej dedičnosti, nutno jest pochopiť konštruktory.</p>

<p>Konštruktor je objekt triedy Function, teda funkcia:</p>

<p>function Fruit( color ) {<br />
this.color = color; }</p>

<p>var apple = […]</p>
]]></description>
			<content:encoded><![CDATA[
<p>Tento článok je pokračovaním série o dedičnosti v JavaScripte:</p>

<ul>
	<li><a
	href="http://coh.io/blog/1048-javascript-zvnutra-14-dedicnost-objektov">JavaScript
	zvnútra 1/4: Dedičnosť objektov</a></li>

	<li><strong>JavaScript zvnútra 2/4: Konštruktory</strong></li>

	<li><a
	href="http://coh.io/blog/1064-javascript-zvnutra-34-prototyp-konstruktora">JavaScript
	zvnútra 3/4: Prototyp konštruktora</a></li>

	<li><a
	href="http://coh.io/blog/1065-javascript-zvnutra-44-dedicnost-medzi-triedami">JavaScript
	zvnútra 4/4: Dedičnosť medzi triedami</a></li>
</ul>

<p>Predsa však, bežnejšia, dostupnejšia a bezpečnejšia forma dedičnosti
ako tá <a
href="http://coh.io/blog/1048-javascript-zvnutra-14-dedicnost-objektov">čisto
objektová</a> je pomocou konštruktorov. Kým sa dostanem k samotnej
dedičnosti, nutno jest pochopiť konštruktory.</p>

<p>Konštruktor je objekt triedy <em>Function</em>, teda funkcia:</p>

<pre class="js"><code><span class="js-keywords1">function</span><span
class="js-out"> Fruit( color )
{
  </span><span
class="js-keywords1">this</span><span
class="js-out">.color = color;
}

</span><span
class="js-keywords1">var</span><span class="js-out"> apple = </span><span
class="js-keywords1">new</span><span class="js-out"> Fruit( </span><span
class="js-quote">&quot;red&quot;</span><span
class="js-out"> );

alert(apple.color); </span><span
class="js-comment">// =&gt; &quot;red&quot;</span></code></pre>

<p><a href="http://jsfiddle.net/VdR7U/"> → Vyskúšajte</a></p>

<p>Tým sme vytvorili objekt <code>apple</code>, inštanciu <code>Fruit</code>,
ktorý má vlastnosť <code>color</code> nastavenú na <code>red</code>. Za
operátorom <code>new</code> sedí kus kódu, ktorý okrem iného zavolá
funkciu <code>Fruit</code> tak, že jej nastaví <code>this</code> na
<code>apple</code>. Asi takto:</p>

<pre class="js"><code><span
class="js-comment">// Vytvor&iacute; obyčajn&yacute; objekt
</span><span
class="js-keywords1">var</span><span class="js-out"> apple = </span><span
class="js-keywords1">new</span><span class="js-out"> Object();
</span><span
class="js-comment">// Zavol&aacute; nad n&iacute;m met&oacute;du Fruit
</span><span
class="js-out">Fruit.call( apple, </span><span
class="js-quote">&quot;red&quot;</span><span
class="js-out"> );

alert( apple.color ); </span><span
class="js-comment">// =&gt; &quot;red&quot;</span></code></pre>

<p><a href="http://jsfiddle.net/u5vqZ/"> → Vyskúšajte</a></p>

<p>Pomocou konštruktora teda pripravíme objekt tým, že mu nastavíme
základné vlastnosti. (Špecifikácia <a
href="http://www.ecmascript.org/">ECMAScript 262</a> tento proces popisuje
detailne v sekcii 13.2.2.)</p>

<h2>Metódy</h2>

<p>Pridajme metódu <code>yellColor</code>, ktorá zareve farbu. Prvé čo nás
napadne je:</p>

<pre class="js"><code><span class="js-keywords1">function</span><span
class="js-out"> Fruit( color )
{
  </span><span
class="js-keywords1">this</span><span
class="js-out">.color = color;
  </span><span
class="js-keywords1">this</span><span class="js-out">.yellColor = </span><span
class="js-keywords1">function</span><span class="js-out">() </span><span
class="js-comment">// Toto je fakt že zle
</span><span
class="js-out">  {
    alert( </span><span class="js-keywords1">this</span><span
class="js-out">.color );
  };
}

</span><span
class="js-keywords1">var</span><span class="js-out"> apple = </span><span
class="js-keywords1">new</span><span class="js-out"> Fruit( </span><span
class="js-quote">&quot;red&quot;</span><span
class="js-out"> );

apple.yellColor(); </span><span
class="js-comment">// =&gt; &quot;red&quot;</span></code></pre>

<p><a href="http://jsfiddle.net/Uzn4z/"> → Vyskúšajte</a></p>

<p>Kód nám síce funguje, nie že nie. Predstavme si ale, že chceme vytvoriť
celé vrece červeného ovocia. Povedzme takých 100ks:</p>

<pre class="js"><code><span class="js-keywords1">var</span><span
class="js-out"> bag = [];
</span><span class="js-keywords1">for</span><span
class="js-out">( </span><span class="js-keywords1">var</span><span
class="js-out"> i = </span><span class="js-num">0</span><span
class="js-out">; i &lt; </span><span class="js-num">100</span><span
class="js-out">; i++ )
{
  bag.push( </span><span
class="js-keywords1">new</span><span class="js-out"> Fruit( </span><span
class="js-quote">&quot;red&quot;</span><span
class="js-out"> ) );
}</span></code></pre>

<p>Pre každú jednu inštanciu vytvoríme jeho vlastnú metódu, čím si
úspešne zahrávame s časom a nárokmi na pamäť. Skúsme si rozpísať čo
sa vlastne deje:</p>

<pre class="js"><code><span class="js-keywords1">var</span><span
class="js-out"> bag = [];
</span><span class="js-keywords1">for</span><span
class="js-out">( </span><span class="js-keywords1">var</span><span
class="js-out"> i = </span><span class="js-num">0</span><span
class="js-out">; i &lt; </span><span class="js-num">100</span><span
class="js-out">; i++ )
{
  </span><span class="js-keywords1">var</span><span
class="js-out"> apple = </span><span class="js-keywords1">new</span><span
class="js-out"> Object();
  apple.color = </span><span
class="js-quote">&quot;red&quot;</span><span
class="js-out">;
  apple.yellColor = </span><span
class="js-keywords1">function</span><span
class="js-out">()
  {
    alert( </span><span
class="js-keywords1">this</span><span
class="js-out">.color );
  }

  bag.push( apple );
}</span></code></pre>

<p>Vytvárať kvôli 100ks ovocia 100ks metód je celkom luxus, ktorý si
môžeme dovoliť iba málokedy. A nie je to len o rýchlosti a pamäti. Ak by
sme takýto kód nechali v našej knižnici a pre jeden z desiatich projektov
by sme potrebovali vypisovať farbu ovocia napríklad do konzoly
(<code>console.log</code>), neostáva nám iba vytvoriť novú vetvu kódu
s iným konštruktorom.</p>

<div><img src="http://coh.io/blog/wp-content/uploads/JavaScript-2-1.png" alt=""
/></div>

<p>Riešením je definovať metódy na <a
href="http://coh.io/blog/1064-javascript-zvnutra-34-prototyp-konstruktora"><code>prototype</code>
konštruktora (v ďalšej časti)</a>.</p>

<p>Ďalšie časti:</p>

<ul>
	<li><a
	href="http://coh.io/blog/1048-javascript-zvnutra-14-dedicnost-objektov">JavaScript
	zvnútra 1/4: Dedičnosť objektov</a></li>

	<li><strong>JavaScript zvnútra 2/4: Konštruktory</strong></li>

	<li><a
	href="http://coh.io/blog/1064-javascript-zvnutra-34-prototyp-konstruktora">JavaScript
	zvnútra 3/4: Prototyp konštruktora</a></li>

	<li><a
	href="http://coh.io/blog/1065-javascript-zvnutra-44-dedicnost-medzi-triedami">JavaScript
	zvnútra 4/4: Dedičnosť medzi triedami</a></li>
</ul>

<!-- by Texy2! -->
<p><a href="http://feedads.g.doubleclick.net/~a/TWun7Bm9SkRTYa9mWotHEKkYc1M/0/da"><img src="http://feedads.g.doubleclick.net/~a/TWun7Bm9SkRTYa9mWotHEKkYc1M/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/TWun7Bm9SkRTYa9mWotHEKkYc1M/1/da"><img src="http://feedads.g.doubleclick.net/~a/TWun7Bm9SkRTYa9mWotHEKkYc1M/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/MartinCohen-Blog?a=fegTzjL-fzw:epmcH8aOxs8:Q_R_9tvTlBE"><img src="http://feeds.feedburner.com/~ff/MartinCohen-Blog?d=Q_R_9tvTlBE" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/MartinCohen-Blog?a=fegTzjL-fzw:epmcH8aOxs8:S_tNKX4Mz-g"><img src="http://feeds.feedburner.com/~ff/MartinCohen-Blog?d=S_tNKX4Mz-g" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/MartinCohen-Blog/~4/fegTzjL-fzw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://coh.io/blog/1062-javascript-zvnutra-24-konstruktory/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://coh.io/blog/1062-javascript-zvnutra-24-konstruktory</feedburner:origLink></item>
		<item>
		<title>JavaScript zvnútra 3/4: Prototyp konštruktora [Web]</title>
		<link>http://feedproxy.google.com/~r/MartinCohen-Blog/~3/-mTYHX1rRrs/1064-javascript-zvnutra-34-prototyp-konstruktora</link>
		<comments>http://coh.io/blog/1064-javascript-zvnutra-34-prototyp-konstruktora#comments</comments>
		<pubDate>Tue, 04 May 2010 12:00:53 +0000</pubDate>
		<dc:creator>Martin Cohen</dc:creator>
				<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://coh.io/blog/?p=1064</guid>
		<description><![CDATA[
<p>Tento článok je pokračovaním série o dedičnosti v JavaScripte:</p>

<p>JavaScript<br />
zvnútra 1/4: Dedičnosť objektov</p>

<p>JavaScript<br />
zvnútra 2/4: Konštruktory</p>

<p>JavaScript zvnútra 3/4: Prototyp konštruktora</p>

<p>JavaScript<br />
zvnútra 4/4: Dedičnosť medzi triedami</p>

<p>Oveľa lepšie, ako pchať metódy priamo do konštruktora, je na to využiť
jeho vlastnosť prototype. Robí sa to takto:</p>

<p>function Fruit( color ) {<br />
this.color = color; }</p>

<p>Fruit.prototy­pe.yellColor = function() {<br />
alert( this.color ); };</p>

<p>var apple = new Fruit( „red“ ); apple.yellColor(); // […]</p>
]]></description>
			<content:encoded><![CDATA[
<p>Tento článok je pokračovaním série o dedičnosti v JavaScripte:</p>

<ul>
	<li><a
	href="http://coh.io/blog/1048-javascript-zvnutra-14-dedicnost-objektov">JavaScript
	zvnútra 1/4: Dedičnosť objektov</a></li>

	<li><a
	href="http://coh.io/blog/1062-javascript-zvnutra-24-konstruktory">JavaScript
	zvnútra 2/4: Konštruktory</a></li>

	<li><strong>JavaScript zvnútra 3/4: Prototyp konštruktora</strong></li>

	<li><a
	href="http://coh.io/blog/1065-javascript-zvnutra-44-dedicnost-medzi-triedami">JavaScript
	zvnútra 4/4: Dedičnosť medzi triedami</a></li>
</ul>

<p>Oveľa lepšie, <a
href="http://coh.io/blog/1062-javascript-zvnutra-24-konstruktory">ako pchať
metódy priamo do konštruktora</a>, je na to využiť jeho vlastnosť
<code>prototype</code>. Robí sa to takto:</p>

<pre class="js"><code><span class="js-keywords1">function</span><span
class="js-out"> Fruit( color )
{
  </span><span
class="js-keywords1">this</span><span
class="js-out">.color = color;
}

Fruit.prototype.yellColor = </span><span
class="js-keywords1">function</span><span
class="js-out">()
{
  alert( </span><span class="js-keywords1">this</span><span
class="js-out">.color );
};

</span><span class="js-keywords1">var</span><span
class="js-out"> apple = </span><span class="js-keywords1">new</span><span
class="js-out"> Fruit( </span><span class="js-quote">&quot;red&quot;</span><span
class="js-out"> );
apple.yellColor(); </span><span
class="js-comment">// =&gt; &quot;red&quot;</span></code></pre>

<p><a href="http://jsfiddle.net/R9VqT/"> → Vyskúšajte</a></p>

<div><img src="http://coh.io/blog/wp-content/uploads/JavaScript-3-1.png" alt=""
/></div>

<p>Každá funkcia má vlastnosť <code>prototype</code>. Pri inštancovaní
operátorom <code>new</code> JavaScript nastaví novému objektu jeho <a
href="http://coh.io/blog/1048-javascript-zvnutra-14-dedicnost-objektov">spomínanú
vlastnosť <code>__proto__</code></a> na <code>prototype</code> konštruktora.
Čiže na pozadí volania <code>var apple = new Fruit( "red" );</code> sa udeje
niečo takéto:</p>

<pre class="js"><code><span
class="js-comment">// Vytvor&iacute; obycajn&yacute; objekt
</span><span
class="js-keywords1">var</span><span class="js-out"> apple = </span><span
class="js-keywords1">new</span><span class="js-out"> Object();
</span><span
class="js-comment">// Nastav&iacute; __proto__ na prototyp kon&scaron;truktora
</span><span
class="js-out">apple.__proto__ = Fruit.prototype;
</span><span
class="js-comment">// Zavol&aacute; nad apple met&oacute;du Fruit
</span><span
class="js-out">Fruit.call(apple, </span><span
class="js-quote">&quot;red&quot;</span><span
class="js-out">);

apple.yellColor(); </span><span
class="js-comment">// =&gt; &quot;red&quot;</span></code></pre>

<p><a href="http://jsfiddle.net/gwEuj/"> → Vyskúšajte</a></p>

<div><img src="http://coh.io/blog/wp-content/uploads/JavaScript-3-2.png" alt=""
/></div>

<p>Metóda <code>yellColor()</code> nie je nastavená priamo inštancii, a preto
sa JavaScript pozrie na jeho <code>__proto__</code>, ktorý ukazuje na
<code>Fruit.prototype</code> a tam ju bezpečne nájde a vykoná.</p>

<p>V príklade z <a
href="http://coh.io/blog/1062-javascript-zvnutra-24-konstruktory">minulej
časti</a> sme ukazovali na problém 100ks ovocia. Ak to skúsime teraz,
uvidíme, že funkcia <code>yellColor()</code> je iba jedna, pre všetky
inštancie spoločná:</p>

<div><img src="http://coh.io/blog/wp-content/uploads/JavaScript-3-3.png" alt=""
/></div>

<p>Ak by sme chceli prinútiť všetky inštancie vypisovať svoje farby do
konzoly, stačí zmeniť prototyp konštruktora, trebárs aj v inej knižnici,
či v projektovo-závislom kóde:</p>

<pre class="js"><code><span
class="js-out">Fruit.prototype.yellColor = </span><span
class="js-keywords1">function</span><span
class="js-out">()
{
  console.log(</span><span
class="js-keywords1">this</span><span
class="js-out">.color);
}

apple.yellColor(); </span><span
class="js-comment">// =&gt; &quot;red&quot; ale tentokr&aacute;t už do konzoly</span></code></pre>

<p><a href="http://jsfiddle.net/CdeYz/"> → Vyskúšajte</a></p>

<p>V ďalšej časti o tom <a
href="http://coh.io/blog/1065-javascript-zvnutra-44-dedicnost-medzi-triedami">ako
funguje dedičnosť medzi triedami</a>.</p>

<p>Ďalšie časti:</p>

<ul>
	<li><a
	href="http://coh.io/blog/1048-javascript-zvnutra-14-dedicnost-objektov">JavaScript
	zvnútra 1/4: Dedičnosť objektov</a></li>

	<li><a
	href="http://coh.io/blog/1062-javascript-zvnutra-24-konstruktory">JavaScript
	zvnútra 2/4: Konštruktory</a></li>

	<li><strong>JavaScript zvnútra 3/4: Prototyp konštruktora</strong></li>

	<li><a
	href="http://coh.io/blog/1065-javascript-zvnutra-44-dedicnost-medzi-triedami">JavaScript
	zvnútra 4/4: Dedičnosť medzi triedami</a></li>
</ul>

<!-- by Texy2! -->
<p><a href="http://feedads.g.doubleclick.net/~a/hob6D17JDL-9RuUij0Y_RDbB4_g/0/da"><img src="http://feedads.g.doubleclick.net/~a/hob6D17JDL-9RuUij0Y_RDbB4_g/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/hob6D17JDL-9RuUij0Y_RDbB4_g/1/da"><img src="http://feedads.g.doubleclick.net/~a/hob6D17JDL-9RuUij0Y_RDbB4_g/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/MartinCohen-Blog?a=-mTYHX1rRrs:l3FQUB0kBdk:Q_R_9tvTlBE"><img src="http://feeds.feedburner.com/~ff/MartinCohen-Blog?d=Q_R_9tvTlBE" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/MartinCohen-Blog?a=-mTYHX1rRrs:l3FQUB0kBdk:S_tNKX4Mz-g"><img src="http://feeds.feedburner.com/~ff/MartinCohen-Blog?d=S_tNKX4Mz-g" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/MartinCohen-Blog/~4/-mTYHX1rRrs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://coh.io/blog/1064-javascript-zvnutra-34-prototyp-konstruktora/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://coh.io/blog/1064-javascript-zvnutra-34-prototyp-konstruktora</feedburner:origLink></item>
		<item>
		<title>JavaScript zvnútra 4/4: Dedičnosť medzi triedami [Web]</title>
		<link>http://feedproxy.google.com/~r/MartinCohen-Blog/~3/q9dG7jqPgrU/1065-javascript-zvnutra-44-dedicnost-medzi-triedami</link>
		<comments>http://coh.io/blog/1065-javascript-zvnutra-44-dedicnost-medzi-triedami#comments</comments>
		<pubDate>Tue, 04 May 2010 11:00:05 +0000</pubDate>
		<dc:creator>Martin Cohen</dc:creator>
				<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://coh.io/blog/?p=1065</guid>
		<description><![CDATA[
<p>Tento článok je pokračovaním série o dedičnosti v JavaScripte:</p>

<p>JavaScript<br />
zvnútra 1/4: Dedičnosť objektov</p>

<p>JavaScript<br />
zvnútra 2/4: Konštruktory</p>

<p>JavaScript<br />
zvnútra 3/4: Prototyp konštruktora</p>

<p>JavaScript zvnútra 4/4: Dedičnosť medzi triedami</p>

<p>Ako vyrobiť triedu Apple, ktorá bude dediť od Fruit? Vieme ako bude
vyzerať Fruit a zhruba ako Apple:</p>

<p>function Fruit( color ) {<br />
this.color = color; }</p>

<p>Fruit.prototy­pe.yellColor = function() {<br />
alert( this.color ); }</p>

<p>function Apple( color ) {<br />
// Zavoláme konštruktor […]</p>
]]></description>
			<content:encoded><![CDATA[
<p>Tento článok je pokračovaním série o dedičnosti v JavaScripte:</p>

<ul>
	<li><a
	href="http://coh.io/blog/1048-javascript-zvnutra-14-dedicnost-objektov">JavaScript
	zvnútra 1/4: Dedičnosť objektov</a></li>

	<li><a
	href="http://coh.io/blog/1062-javascript-zvnutra-24-konstruktory">JavaScript
	zvnútra 2/4: Konštruktory</a></li>

	<li><a
	href="http://coh.io/blog/1064-javascript-zvnutra-34-prototyp-konstruktora">JavaScript
	zvnútra 3/4: Prototyp konštruktora</a></li>

	<li><strong>JavaScript zvnútra 4/4: Dedičnosť medzi triedami</strong></li>
</ul>

<p>Ako vyrobiť triedu <code>Apple</code>, ktorá bude dediť od
<code>Fruit</code>? Vieme ako bude vyzerať <code>Fruit</code> a zhruba ako
<code>Apple</code>:</p>

<pre class="js"><code><span class="js-keywords1">function</span><span
class="js-out"> Fruit( color )
{
  </span><span
class="js-keywords1">this</span><span
class="js-out">.color = color;
}

Fruit.prototype.yellColor = </span><span
class="js-keywords1">function</span><span
class="js-out">()
{
  alert( </span><span class="js-keywords1">this</span><span
class="js-out">.color );
}

</span><span
class="js-keywords1">function</span><span
class="js-out"> Apple( color )
{
  </span><span
class="js-comment">// Zavol&aacute;me kon&scaron;truktor Fruit, aby in&scaron;tancii nastavil farbu
</span><span
class="js-out">  Fruit.call( </span><span class="js-keywords1">this</span><span
class="js-out">, color );
}

</span><span class="js-keywords1">var</span><span
class="js-out"> apple = </span><span class="js-keywords1">new</span><span
class="js-out"> Apple(</span><span class="js-quote">&quot;red&quot;</span><span
class="js-out">);
apple.yellColor();
</span><span
class="js-comment">// Uncaught TypeError:
// Object #&lt;an Apple&gt; has no method 'yellColor'</span></code></pre>

<p>A teraz ako to spojiť? Chceme aby objekt vytvorený triedou
<code>Apple</code> videl na metódu <code>Fruit.prototype.yellColor()</code>.
Budeme navzájom prepájať <code>prototype</code> vlastnosti. Niekoho môže
napadnúť toto:</p>

<pre class="js"><code><span
class="js-out">Apple.prototype = Fruit.prototype;</span></code></pre>

<p>Lenže v tom prípade by sme prídávaním, či úpravou
<code>Apple.prototype</code> priamo prepisovali aj <code>Fruit.prototype</code>
a to nechceme. V prvej časti sme použili <code>__proto__</code>, to môžeme
aj teraz:</p>

<pre class="js"><code><span
class="js-comment">// Čokoľvek definovan&eacute; vo Fruit.prototype bude
// viditeľn&eacute; i v Apple.prototype
</span><span
class="js-out">Apple.prototype.__proto__ = Fruit.prototype;</span></code></pre>

<p><a href="http://jsfiddle.net/NZfUn/"> → Vyskúšajte</a></p>

<p><strong>Ale ako bolo písané v prvej časti tiež: <code>__proto__</code>
nie je štandardnou súčasťou implementácii.</strong> Vieme ho ale simulovať
tak, že medzi <code>Apple</code> a <code>Fruit</code> strčíme ešte jeden
pomocný konštruktor, jeho prototyp a inštanciu:</p>

<pre class="js"><code><span
class="js-comment">// Vytvor&iacute;me pomocn&yacute; primit&iacute;vny kon&scaron;truktor `Q`
</span><span
class="js-keywords1">function</span><span class="js-out"> Q() {};
</span><span
class="js-comment">// Jeho prototyp nastav&iacute;me na prototyp rodičovskej triedy `Fruit`
</span><span
class="js-out">Q.prototype = Fruit.prototype;
</span><span
class="js-comment">// A prototyp detskej triedy nastav&iacute;me na nov&uacute; in&scaron;tanciu triedy `Q`
</span><span
class="js-out">Apple.prototype = </span><span
class="js-keywords1">new</span><span class="js-out"> Q;
</span><span
class="js-comment">// Oprav&iacute;me referenciu na kon&scaron;truktor (inak by ukazovala na Q)
</span><span
class="js-out">Apple.prototype.constructor = Apple;</span></code></pre>

<p><a href="http://jsfiddle.net/ed6k4/"> → Vyskúšajte</a></p>

<div><img src="http://coh.io/blog/wp-content/uploads/JavaScript-4-1.png" alt=""
/></div>

<p>Diagram síce vyzerá <em>hnusoprskne,</em> ale v skutočnosti je tých
krokov podstatne menej. K <code>Fruit.prototype</code> sa totiž JavaScript
dostane už v druhom kroku: <code>(new Q).__proto__</code>, pretože <code>(new
Q).__proto__ == Q.prototype == Fruit.prototype</code>.</p>

<p>Keď rozpíšeme riadok <code>Apple.prototype = new Q;</code> podľa toho čo
už o operátore <code>new</code> vieme, zistíme, že JavaScript nám
vlastnosť <code>__proto__</code> nastaví tak ako by sme radi:</p>

<pre class="js"><code><span class="js-keywords1">function</span><span
class="js-out"> Q() {};
Q.prototype = Fruit.prototype;
Apple.prototype = </span><span
class="js-keywords1">new</span><span
class="js-out"> Object();
Apple.prototype.__proto__ = Q.prototype;</span></code></pre>

<p><a href="http://jsfiddle.net/XVvKS/"> → Vyskúšajte</a></p>

<p>Treba si dávať pozor iba na to, že tento kód nám prepíše celý
<code>Apple.prototype</code> a preto je dôležité ho volať predtým ako
začneme do neho nastavovať metódy. Celokus, kde <code>Apple</code> dedí od
<code>Fruit</code> bez použitia <code>__proto__</code> vypadá takto:</p>

<pre class="js"><code><span class="js-keywords1">function</span><span
class="js-out"> Fruit( color )
{
  </span><span
class="js-keywords1">this</span><span
class="js-out">.color = color;
}

Fruit.prototype.yellColor = </span><span
class="js-keywords1">function</span><span
class="js-out">()
{
  alert( </span><span class="js-keywords1">this</span><span
class="js-out">.color );
}

</span><span
class="js-keywords1">function</span><span
class="js-out"> Apple( color )
{
  </span><span
class="js-comment">// Zavol&aacute;me kon&scaron;truktor Fruit, aby in&scaron;tancii nastavil farbu
</span><span
class="js-out">  Fruit.call(</span><span class="js-keywords1">this</span><span
class="js-out">, color);
}

</span><span
class="js-comment">// Vytvor&iacute;me pomocn&yacute; primit&iacute;vny kon&scaron;truktor `Q`
</span><span
class="js-keywords1">function</span><span class="js-out"> Q() {};
</span><span
class="js-comment">// Jeho prototyp nastav&iacute;me na prototyp rodičovskej triedy `Fruit`
</span><span
class="js-out">Q.prototype = Fruit.prototype;
</span><span
class="js-comment">// A prototyp detskej triedy nastav&iacute;me na nov&uacute; in&scaron;tanciu triedy `Q`
</span><span
class="js-out">Apple.prototype = </span><span
class="js-keywords1">new</span><span class="js-out"> Q;
</span><span
class="js-comment">// Oprav&iacute;me referenciu na kon&scaron;truktor (inak by ukazovala na Q)
</span><span
class="js-out">Apple.prototype.constructor = Apple;

Apple.prototype.fallOnNewtonsHead = </span><span
class="js-keywords1">function</span><span class="js-out">()
</span><span
class="js-comment">//...</span></code></pre>

<p>Pochopiteľne je možné si napísať jednoduchú funkciu, ktorá dedenie
urobí krajšie. Takto:</p>

<pre class="js"><code><span class="js-keywords1">function</span><span
class="js-out"> </span><span class="js-keywords1">extends</span><span
class="js-out">( Child, Parent )
{
  </span><span
class="js-keywords1">function</span><span
class="js-out"> Q() {};
  Q.prototype = Parent.prototype;
  Child.prototype = </span><span
class="js-keywords1">new</span><span
class="js-out"> Q;
  Child.prototype.constructor = Child;
}

</span><span
class="js-keywords1">extends</span><span
class="js-out">( Apple, Fruit );

</span><span
class="js-keywords1">var</span><span class="js-out"> apple = </span><span
class="js-keywords1">new</span><span class="js-out"> Apple(</span><span
class="js-quote">&quot;red&quot;</span><span
class="js-out">);
apple.yellColor(); </span><span
class="js-comment">// =&gt; &quot;red&quot;</span></code></pre>

<p><a href="http://jsfiddle.net/bPLqC/"> → Vyskúšajte</a></p>

<p>Príklad funguje i keď inštancia <code>apple</code> nemá zadefinovanú
metódu <code>yellColor()</code>. Tá je definovaná až na triede
<code>Fruit</code>. JavaScript si ju však veselo nájde postupným
prechádzaním <code>__proto__</code>:</p>

<pre class="js"><code><span
class="js-comment">// JS sa najprv pozrie na objekt apple
</span><span
class="js-out">apple
</span><span
class="js-comment">// Ak tam nie je, tak na jeho __proto__, ktor&eacute; ukazuje na Apple.prototype a to na q.prototype
</span><span
class="js-out">apple.__proto__            = Apple.prototype
</span><span
class="js-comment">// Ak tam nie je, tak na jeho __proto__, ktor&eacute; ukazuje na Q.prototype a to zase na Fruit.prototype
</span><span
class="js-out">apple.__proto__.__proto__  = Apple.prototype.__proto__ = Q.prototype = Fruit.prototype</span></code></pre>

<p>Celé to však nie je iba o tom, aby JavaScript vedel danú vlastnosť
nájsť. Ide aj o možnosť zistiť o inštanciu akej triedy ide. Na to
slúži operátor <code>instanceof</code>. Objekt <code>apple</code> teda bude
inštanciou ako <code>Apple</code>, tak <code>Fruit</code>:</p>

<pre class="js"><code><span
class="js-comment">// Je apple in&scaron;tanciou Apple?
</span><span
class="js-out">alert( apple </span><span
class="js-keywords1">instanceof</span><span
class="js-out"> Apple ); </span><span
class="js-comment">// =&gt; true
// Je apple in&scaron;tanciou Fruit?
</span><span
class="js-out">alert( apple </span><span
class="js-keywords1">instanceof</span><span
class="js-out"> Fruit ); </span><span
class="js-comment">// =&gt; true</span></code></pre>

<p><a href="http://jsfiddle.net/8A9gv/"> → Vyskúšajte</a></p>

<p>V súčasnosti už existuje množstvo článkov o tom, ako si zjednodušiť
dedenie, či používať kopu ďalších pekných a užítočných postupov
známych z iných jazykov. Úlohou tohto článku bolo odkryť čo sa deje pod
kapotou. Ostatné je už na vašej chuti.</p>

<p>Doporučujem sa mrknúť na nedávnu trojsériu od <a
href="http://zdrojak.root.cz/clanky/oop-v-javascriptu-i/">Daniela Steigerwalda
na Zdrojáku</a>.</p>

<p>Predchádzajúce časti:</p>

<ul>
	<li><a
	href="http://coh.io/blog/1048-javascript-zvnutra-14-dedicnost-objektov">JavaScript
	zvnútra 1/4: Dedičnosť objektov</a></li>

	<li><a
	href="http://coh.io/blog/1062-javascript-zvnutra-24-konstruktory">JavaScript
	zvnútra 2/4: Konštruktory</a></li>

	<li><a
	href="http://coh.io/blog/1064-javascript-zvnutra-34-prototyp-konstruktora">JavaScript
	zvnútra 3/4: Prototyp konštruktora</a></li>

	<li><strong>JavaScript zvnútra 4/4: Dedičnosť medzi triedami</strong></li>
</ul>

<!-- by Texy2! -->
<p><a href="http://feedads.g.doubleclick.net/~a/aan1y7GGrckeaFdmBQ1tG8m_Z38/0/da"><img src="http://feedads.g.doubleclick.net/~a/aan1y7GGrckeaFdmBQ1tG8m_Z38/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/aan1y7GGrckeaFdmBQ1tG8m_Z38/1/da"><img src="http://feedads.g.doubleclick.net/~a/aan1y7GGrckeaFdmBQ1tG8m_Z38/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/MartinCohen-Blog?a=q9dG7jqPgrU:rwPz2TyMsrE:Q_R_9tvTlBE"><img src="http://feeds.feedburner.com/~ff/MartinCohen-Blog?d=Q_R_9tvTlBE" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/MartinCohen-Blog?a=q9dG7jqPgrU:rwPz2TyMsrE:S_tNKX4Mz-g"><img src="http://feeds.feedburner.com/~ff/MartinCohen-Blog?d=S_tNKX4Mz-g" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/MartinCohen-Blog/~4/q9dG7jqPgrU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://coh.io/blog/1065-javascript-zvnutra-44-dedicnost-medzi-triedami/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://coh.io/blog/1065-javascript-zvnutra-44-dedicnost-medzi-triedami</feedburner:origLink></item>
		<item>
		<title>Kúsok špecifikácie [Rýchlovky]</title>
		<link>http://feedproxy.google.com/~r/MartinCohen-Blog/~3/g4oKqIBoZs8/1026-kusok-specifikacie</link>
		<comments>http://coh.io/blog/1026-kusok-specifikacie#comments</comments>
		<pubDate>Fri, 30 Apr 2010 15:47:58 +0000</pubDate>
		<dc:creator>Martin Cohen</dc:creator>
				<category><![CDATA[Rýchlovky]]></category>

		<guid isPermaLink="false">http://coh.io//blog/?p=1026</guid>
		<description><![CDATA[
<p>„When a reference is made to a property in an object, that reference is to
the property of that name in the first object in the prototype chain that
contains a property of that name.“ – Ahá, tak už rozumiem.</p>

<!-- by Texy2! -->]]></description>
			<content:encoded><![CDATA[
<p><em>„When a reference is made to a property in an object, that reference is
to the property of that name in the first object in the prototype chain that
contains a property of that name.“</em> – Ahá, tak už rozumiem.</p>

<!-- by Texy2! -->
<p><a href="http://feedads.g.doubleclick.net/~a/sGOPESGyBG9KAD0SmqcRpcGMVQY/0/da"><img src="http://feedads.g.doubleclick.net/~a/sGOPESGyBG9KAD0SmqcRpcGMVQY/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/sGOPESGyBG9KAD0SmqcRpcGMVQY/1/da"><img src="http://feedads.g.doubleclick.net/~a/sGOPESGyBG9KAD0SmqcRpcGMVQY/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/MartinCohen-Blog?a=g4oKqIBoZs8:qaTjrNJmU48:Q_R_9tvTlBE"><img src="http://feeds.feedburner.com/~ff/MartinCohen-Blog?d=Q_R_9tvTlBE" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/MartinCohen-Blog?a=g4oKqIBoZs8:qaTjrNJmU48:S_tNKX4Mz-g"><img src="http://feeds.feedburner.com/~ff/MartinCohen-Blog?d=S_tNKX4Mz-g" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/MartinCohen-Blog/~4/g4oKqIBoZs8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://coh.io/blog/1026-kusok-specifikacie/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://coh.io/blog/1026-kusok-specifikacie</feedburner:origLink></item>
		<item>
		<title>Intoru Forms: ElasticContainer [Web]</title>
		<link>http://feedproxy.google.com/~r/MartinCohen-Blog/~3/RkwriEa98xs/1014-intoru-forms-elasticcontainer</link>
		<comments>http://coh.io/blog/1014-intoru-forms-elasticcontainer#comments</comments>
		<pubDate>Mon, 26 Apr 2010 15:54:58 +0000</pubDate>
		<dc:creator>Martin Cohen</dc:creator>
				<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://coh.io//blog/?p=1014</guid>
		<description><![CDATA[
<p>Jednou z vecí na ktorú som sa tešil pri implementácii Intoru Forms je
práve ElasticContainer (asi dočasný názov). V Nette totiž nie je možné
urobiť kontajner s dynamickým počtom polí (ochrchlať sa to dá, ale je to
škaradé).</p>

<p>Prvým príkladom budiž prílohy. Ak chcem dať užívateľovi možnosť
pridať niekoľko príloh do formuláru, neviem vopred počet políčok, ten sa
nastaví až u klienta. ElasticContainer to rieši […]</p>

<!-- by Texy2! -->]]></description>
			<content:encoded><![CDATA[
<p>Jednou z vecí na ktorú som sa tešil pri implementácii <a
href="http://coh.io//blog/982-inaksie-formulare-v-nette">Intoru Forms</a> je
práve <em>ElasticContainer</em> (asi dočasný názov). V Nette totiž <a
href="http://forum.nettephp.com/cs/1825-dynamicky-pocet-poli">nie je možné</a>
urobiť kontajner s dynamickým počtom polí (ochrchlať sa to dá, ale je to
škaradé).</p>

<p>Prvým príkladom budiž prílohy. Ak chcem dať užívateľovi možnosť
pridať niekoľko príloh do formuláru, neviem vopred počet políčok, ten sa
nastaví až u klienta. <em>ElasticContainer</em> to rieši tak, že svoje
detské políčka nastaví až pri prijatí hodnôt. Každé políčko je klon
nejakého vopred definovaného poľa – tzv. <em>prototypu</em>.</p>

<p>Ak chcem prílohy, urobím:</p>

<pre class="php"><code><span class="php-var">$form</span>-&gt;add( <span
class="php-quote">'files'</span>, <span
class="php-keyword1">new</span> ElasticContainer( <span
class="php-keyword1">new</span> <span
class="php-keyword2">File</span> ) );</code></pre>

<p>Ak chcem tagy, urobím:</p>

<pre class="php"><code><span class="php-var">$form</span>-&gt;add( <span
class="php-quote">'tags'</span>, <span
class="php-keyword1">new</span> ElasticContainer( <span
class="php-keyword1">new</span> String ) );</code></pre>

<p>Ak chcem na prototype validácie, urobím validácie na prototype:</p>

<pre class="php"><code><span class="php-var">$form</span>-&gt;add( <span
class="php-quote">'emails'</span>, <span
class="php-keyword1">new</span> ElasticContainer( <span
class="php-keyword1">new</span> String ) )
  -&gt;getPrototype()
    -&gt;validates(<span
class="php-quote">'email'</span>);</code></pre>

<p>Validátorom <code>count</code> nad <em>ElasticContainer</em> môžem
obmedziť počet políčok:</p>

<pre class="php"><code><span class="php-var">$form</span>-&gt;add( <span
class="php-quote">'emails'</span>, <span
class="php-keyword1">new</span> ElasticContainer( <span
class="php-keyword1">new</span> String ) )
  -&gt;validates( <span
class="php-quote">'count'</span>, <span class="php-num">3</span>, <span
class="php-num">10</span> )
  -&gt;getPrototype()
    -&gt;validates(<span
class="php-quote">'email'</span>);</code></pre>

<p>Hodnoty získam a nastavím volaním <code>get/setValue</code>:</p>

<pre class="php"><code><span class="php-var">$c</span> = <span
class="php-var">$form</span>-&gt;add( <span
class="php-quote">'tags'</span>, <span
class="php-keyword1">new</span> ElasticContainer( <span
class="php-keyword1">new</span> String ) );
<span
class="php-comment">//...
</span><span
class="php-var">$c</span>-&gt;setValue( <span
class="php-keyword2">array</span>(<span class="php-quote">'apple'</span>, <span
class="php-quote">''</span>, <span class="php-quote">'juice'</span>, <span
class="php-keyword1">NULL</span>, <span
class="php-quote">'banana'</span>) );
<span
class="php-comment">//...
</span><span
class="php-var">$c</span>-&gt;getValue(); <span
class="php-comment">// =&gt; array('apple', 'juice', 'banana')</span></code></pre>

<p>Šablona je potom jednoduchá:</p>

<pre class="php"><code>{<span class="php-keyword1">foreach</span> <span
class="php-var">$container</span> <span class="php-keyword1">as</span> <span
class="php-var">$field}</span>
  {form:text <span
class="php-var">$field}</span>
{/<span
class="php-keyword1">foreach</span>}</code></pre>

<p>Vypíše všetky nastavené políčka, minimálne a maximálne však toľko
koľko sa nastavilo cez <code>ElasticContainer::setMinimum/setMaximum</code>
alebo cez <code>$container-&gt;validates( 'count', $minimum, $maximum
)</code>.</p>

<!-- by Texy2! -->
<p><a href="http://feedads.g.doubleclick.net/~a/HDS8m-Shg1EhVdC0jrWypoa6Naw/0/da"><img src="http://feedads.g.doubleclick.net/~a/HDS8m-Shg1EhVdC0jrWypoa6Naw/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/HDS8m-Shg1EhVdC0jrWypoa6Naw/1/da"><img src="http://feedads.g.doubleclick.net/~a/HDS8m-Shg1EhVdC0jrWypoa6Naw/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/MartinCohen-Blog?a=RkwriEa98xs:0ZIme0C5ruk:Q_R_9tvTlBE"><img src="http://feeds.feedburner.com/~ff/MartinCohen-Blog?d=Q_R_9tvTlBE" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/MartinCohen-Blog?a=RkwriEa98xs:0ZIme0C5ruk:S_tNKX4Mz-g"><img src="http://feeds.feedburner.com/~ff/MartinCohen-Blog?d=S_tNKX4Mz-g" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/MartinCohen-Blog/~4/RkwriEa98xs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://coh.io/blog/1014-intoru-forms-elasticcontainer/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://coh.io/blog/1014-intoru-forms-elasticcontainer</feedburner:origLink></item>
		<item>
		<title>Menej ukecané formuláre v Nette [Web]</title>
		<link>http://feedproxy.google.com/~r/MartinCohen-Blog/~3/7cu2pittbAg/998-menej-ukecane-formulare-v-nette</link>
		<comments>http://coh.io/blog/998-menej-ukecane-formulare-v-nette#comments</comments>
		<pubDate>Sun, 25 Apr 2010 09:31:32 +0000</pubDate>
		<dc:creator>Martin Cohen</dc:creator>
				<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://coh.io//blog/?p=998</guid>
		<description><![CDATA[
<p>Centi dnes dostal nápad na vylepšenie nášho FormHelper na vykreslovanie
Intoru formulárov v Nette. A myslím, že to bol dobrý nápad. Povážte:
doteraz sme boli nútení opakovane vymenovávať pre ktoré políčko ideme
vykreslovať popisok, chybky a samotný widget:</p>

<p>{form $form}<br />
{form:label $form[‚documen­t‘][‚title‘]}Ti­tulok{/form:la­bel}<br />
{form:error $form[‚documen­t‘][‚title‘]}<br />
{form:text $form[‚documen­t‘][‚title‘], ‚width‘ ⇒ ‚100%‘}
{/form}</p>

<p>Po novom sa veci značne zjednodušujú, vďaka párovému Latte helperu
{form:with …} […]</p>

<!-- by Texy2! -->]]></description>
			<content:encoded><![CDATA[
<p><a href="http://centi.sk/">Centi</a> dnes dostal nápad na vylepšenie
nášho <code>FormHelper</code> na vykreslovanie <a
href="http://coh.io//blog/982-inaksie-formulare-v-nette">Intoru formulárov
v Nette</a>. A myslím, že to bol dobrý nápad. Povážte: doteraz sme boli
nútení opakovane vymenovávať pre ktoré políčko ideme vykreslovať
popisok, chybky a samotný widget:</p>

<pre
class="html"><code>{form $form}
  {form:label $form['document']['title']}Titulok{/form:label}
  {form:error $form['document']['title']}
  {form:text $form['document']['title'], 'width' =&gt; '100%'}
{/form}</code></pre>

<p>Po novom sa veci značne zjednodušujú, vďaka párovému Latte helperu
<code>{form:with ...}</code> a pár ďalším novinkám:</p>

<pre
class="html"><code>{form $form}

  {form:label 'document/title' }
  {form:error 'document/title' }
  {form:text  'document/title', 'width' =&gt; '100%'}

  {* --- alebo --- *}

  {form:with 'document/title'}
    {form:label}
    {form:error}
    {form:text 'width' =&gt; '100%'}
  {/form:with}

  {* --- alebo --- *}

  {form:with 'document'}
    {form:label 'title'}
    {form:error 'title'}
    {form:text  'title', 'width' =&gt; '100%'}
  {/form:with}

  {* --- alebo --- *}

  {form:with 'document'}
    {form:with 'title'}
      {form:label}
      {form:error}
      {form:text 'width' =&gt; '100%'}
    {/form:with}
  {/form:with}

{/form}</code></pre>

<p>Všetky varianty sa dajú miešať jedna cez druhú a použiť to čo príde
lepšie. Tu je ukážka kúsku z editora užívateľa:</p>

<pre class="html"><code>{form:with 'email'}
  <span
class="html-tag">&lt;tr&gt;</span>
    <span class="html-tag">&lt;th</span><span
class="html-tagin"> class=</span><span
class="html-quote">&quot;w-min&quot;</span><span
class="html-tag">&gt;</span>{form:label}E-mail:{/form:label}<span
class="html-tag">&lt;/th&gt;</span>
    <span
class="html-tag">&lt;td&gt;</span>
      {form:error 'class' =&gt; 'mb-s w-text'}
      {form:text 'width' =&gt; '30em'}
    <span
class="html-tag">&lt;/td&gt;</span>
  <span
class="html-tag">&lt;/tr&gt;</span>
{/form:with}

<span
class="html-tag">&lt;tr&gt;</span>
  <span class="html-tag">&lt;th</span><span
class="html-tagin"> class=</span><span
class="html-quote">&quot;w-min va-t&quot;</span><span
class="html-tag">&gt;</span>{form:label 'password'}Password{/form:label}<span
class="html-tag">&lt;/th&gt;</span>
  <span
class="html-tag">&lt;td&gt;</span>
    <span
class="html-tag">&lt;div</span><span class="html-tagin"> class=</span><span
class="html-quote">&quot;mb-s&quot;</span><span
class="html-tag">&gt;</span>
      {form:error 'password'}
      {form:password 'password', 'width' =&gt; '15em', 'autocomplete' =&gt; 'off'}
    <span
class="html-tag">&lt;/div&gt;</span>
    <span
class="html-tag">&lt;div&gt;</span>
      {form:error 'password_confirmation'}
      {form:password 'password_confirmation', 'width' =&gt; '15em', 'autocomplete' =&gt; 'off'}
    <span
class="html-tag">&lt;/div&gt;</span>
  <span
class="html-tag">&lt;/td&gt;</span>
<span
class="html-tag">&lt;/tr&gt;</span></code></pre>

<!-- by Texy2! -->
<p><a href="http://feedads.g.doubleclick.net/~a/2x9K8YzFaJ12HNqXKoxpBQvhfFE/0/da"><img src="http://feedads.g.doubleclick.net/~a/2x9K8YzFaJ12HNqXKoxpBQvhfFE/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/2x9K8YzFaJ12HNqXKoxpBQvhfFE/1/da"><img src="http://feedads.g.doubleclick.net/~a/2x9K8YzFaJ12HNqXKoxpBQvhfFE/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/MartinCohen-Blog?a=7cu2pittbAg:GOsylVDCz8k:Q_R_9tvTlBE"><img src="http://feeds.feedburner.com/~ff/MartinCohen-Blog?d=Q_R_9tvTlBE" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/MartinCohen-Blog?a=7cu2pittbAg:GOsylVDCz8k:S_tNKX4Mz-g"><img src="http://feeds.feedburner.com/~ff/MartinCohen-Blog?d=S_tNKX4Mz-g" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/MartinCohen-Blog/~4/7cu2pittbAg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://coh.io/blog/998-menej-ukecane-formulare-v-nette/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://coh.io/blog/998-menej-ukecane-formulare-v-nette</feedburner:origLink></item>
	</channel>
</rss>

