<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="/stylesheets/rss.css" type="text/css"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
  <channel>
    <title>Jaros&#322;aw Zabie&#322;&#322;o - BLOG: Tag prototype</title>
    <link>http://blog.zabiello.com/articles/tag/prototype</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description>moje notatki, linki, komentarze</description>
    <item>
      <title>Jester:  czy to jeszcze Javascript? ;)</title>
      <description>&lt;p&gt;&lt;a href="http://rubyonrails.pl"&gt;Rails&lt;/a&gt; jest inspiracj&#261; do powstawania coraz bardziej niesamowitych bibliotek. Takim przyk&#322;adem jest biblioteka &lt;a href="http://giantrobots.thoughtbot.com/2007/4/2/jester-javascriptian-rest"&gt;Jester&lt;/a&gt; kt&#243;ra na bazie &lt;a href="http://www.prototypejs.org/"&gt;Prototype&lt;/a&gt; umo&#380;liwia za pomoc&#261; JavaScript komunikacj&#281; z serwerem (AJAX) w stylu prawie identycznym do Rubiego i modu&#322;u &lt;a href="http://api.rubyonrails.org/classes/ActionController/Resources.html"&gt;ActiveResource&lt;/a&gt; u&#380;ywanego w Railsach. &lt;a href="http://giantrobots.thoughtbot.com/2007/4/2/jester-javascriptian-rest"&gt;Jester&lt;/a&gt;  u&#380;ywa do tego najnowszej implementacji &lt;span class="caps"&gt;REST&lt;/span&gt; kt&#243;ra jest &lt;a href="http://wiki.rubyonrails.com/rails/pages/ActiveResource"&gt;wbudowana&lt;/a&gt; i silnie promowana w RoR.&lt;/p&gt;</description>
      <pubDate>Tue, 03 Apr 2007 12:08:00 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:b4ae77d0-0b9b-48f6-b569-ed6c07a207a6</guid>
      <author>Jaros&#322;aw Zabie&#322;&#322;o</author>
      <link>http://blog.zabiello.com/articles/2007/04/03/jester-czy-to-jeszcze-javascript</link>
      <category>rails</category>
      <category>rest</category>
      <category>prototype</category>
    </item>
    <item>
      <title>Prototype - oficjalne API i dokumentacja</title>
      <description>&lt;p&gt;Znana biblioteka &lt;strong&gt;Prototype&lt;/strong&gt; doczeka&#322;a si&#281; w&#322;asnej dokumentacji, &lt;span class="caps"&gt;API&lt;/span&gt; oraz bloga: &lt;a href="http://prototypejs.org/"&gt;http://prototypejs.org&lt;/a&gt;. Prototype zapewnia lekkie, eleganckie &lt;span class="caps"&gt;API&lt;/span&gt; &lt;strong&gt;o sk&#322;adni wzorowanej na j&#281;zyku Ruby&lt;/strong&gt;. Ta sk&#322;adnia jest tak &#322;adna, &#380;e niekt&#243;rzy nawet nie widz&#261; potrzeby tworzenia dodatkowych helper&#243;w.  W tej chwili to, moim zdaniem, najlepsza biblioteka do JavaScript i &lt;span class="caps"&gt;AJAX&lt;/span&gt;. &lt;a href="http://rubyonrails.org"&gt;Rails&lt;/a&gt; postawi&#322; zdecydowanie na dobrego konia. &lt;a href="http://pylonshq.com"&gt;Pylons&lt;/a&gt; &amp;#8211; niejako  &amp;#8220;z rozp&#281;du&amp;#8221;, bo skopiowali railsowe helpery &amp;#8211; te&#380;. :)&lt;/p&gt;


	&lt;p&gt;Rozmawia&#322;em niedawno na &lt;span class="caps"&gt;IRC&lt;/span&gt;&amp;#8217;u (irc.freenode#pylons) z developerami &lt;a href="http://pylonshq.com"&gt;Pylons&#243;w&lt;/a&gt;. Maj&#261; rozszerzy&#263; swoje helpery o dodatkowe funkcje, ale nie zaimplementuj&#261; p&#281;tli kt&#243;re s&#261; w Prototype i railsowych &lt;a href="http://www.rubyinside.com/16-rjs-resources-and-tutorials-for-rails-programmers-5.html"&gt;&lt;span class="caps"&gt;RJS&lt;/span&gt;&lt;/a&gt; (szablonach generuj&#261;cych JavaScript w j&#281;z. Ruby) Ograniczeniem jest tu sk&#322;adnia Pythona. Tzn. mo&#380;na by si&#281; pokusi&#263; o tak&#261; implementacj&#281;, ale by&#322;aby ma&#322;o &amp;#8220;pythonic&amp;#8221;, tj. zgodna z filozofi&#261; i czytelno&#347;ci&#261; j&#281;zyka Python. Wi&#281;c raczej na &lt;span class="caps"&gt;RJS&lt;/span&gt; dla Pythona nie ma co liczy&#263;.&lt;/p&gt;


	&lt;p&gt;Wg mnie te wszystkie helpery jakie ma RoR (i &lt;span class="caps"&gt;RJS&lt;/span&gt; w szczeg&#243;lno&#347;ci) to jedna z lepszych cech Rails&#243;w kt&#243;rej brak  u konkurencji. Nie zgodz&#281; si&#281; tu z tymi, co uwa&#380;aj&#261; &#380;e lepiej w og&#243;le nie u&#380;ywa&#263; &#380;adnych helper&#243;w i pisa&#263; w czystym JavaScript.  Mimo &#322;adnej sk&#322;adni Prototype, railsowe helpery i &lt;span class="caps"&gt;RJS&lt;/span&gt; daj&#261; znacznie wi&#281;kszy komfort pracy. Np. we&#378;my tak&#261; konstrukcj&#281; w pliku &lt;span class="caps"&gt;RJS&lt;/span&gt;:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="ident"&gt;page&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;replace_html&lt;/span&gt; &lt;span class="symbol"&gt;:my_id&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:partial&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;podszablon&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Co robi powy&#380;sza metoda? Buduje kod JavaScript kt&#243;ry podmienia zawarto&#347;&#263; (innerHTML) dla tagu o id =&amp;#8217;my_id&amp;#8217; zawarto&#347;ci&#261; szablonu &lt;span class="caps"&gt;RHTML&lt;/span&gt; (oczywi&#347;cie jego zawarto&#347;&#263; jest automatycznie &amp;#8220;escape&amp;#8217;owana&amp;#8221;, aby kod JS si&#281; nie wysypa&#322;). Trzeba si&#281; nie&#378;le napracowa&#263; aby uzyska&#263; podobny efekt poza Railsami.&lt;/p&gt;


	&lt;p&gt;Troch&#281; si&#281; dziwi&#281;, &#380;e &lt;a href="http;//djangoproject.com"&gt;Django&lt;/a&gt; my&#347;li o &lt;a href="http://article.gmane.org/gmane.comp.web.dojo.user/3603"&gt;dodaniu Dojo&lt;/a&gt; zamiast Prototype. Mamy w pracy raczej z&#322;e do&#347;wiadczenie z Dojo. Jest ci&#281;&#380;kie, zamotane, trudne do debugowania, modyfikacji. To po cz&#281;&#347;ci efekt podej&#347;cia nastawionego na u&#380;ywanie z&#322;o&#380;onych komponent&#243;w (na&#347;laduj&#261; .NET?) Takie podej&#347;cie (u&#380;ywanie zbyt wysokopoziomowych, z&#322;o&#380;onych komponent&#243;w) generalnie spotyka si&#281; z krytyk&#261; wielu programist&#243;w. Pro&#347;ciej operowa&#263; elastycznym i przejrzystym  kodem (takim jak w Prototype) ni&#380; gotowymi, zamkni&#281;tymi i  trudnymi do debugowania komponentami Dojo.&lt;/p&gt;</description>
      <pubDate>Fri, 19 Jan 2007 16:53:00 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:f2186883-61cb-4878-ac1c-a526a3b53694</guid>
      <author>Jaros&#322;aw Zabie&#322;&#322;o</author>
      <link>http://blog.zabiello.com/articles/2007/01/19/prototype-oficjalne-api-i-dokumentacja</link>
      <category>prototype</category>
      <category>ajax</category>
      <category>javascript</category>
      <category>rjs</category>
      <category>rails</category>
      <category>dojo</category>
    </item>
    <item>
      <title>JavaScript idzie w dobrym kierunku</title>
      <description>&lt;p&gt;Musz&#281; przyzna&#263;, &#380;e od czasu grzebania w bibliotece &lt;a href="http://prototype.conio.net/"&gt;Prototype&lt;/a&gt; spojrza&#322;em w troch&#281; &#347;wie&#380;y spos&#243;b na j&#281;zyk JavaScript. Prototype jest przyk&#322;adem tego, jak bardzo elegancki, dynamiczny i obiektowy kodu mo&#380;na pisa&#263; w tym j&#281;zyku. Pozwala te&#380; na pisanie bardzo eleganckiego kodu mocno &lt;a href="http://encytemedia.com/blog/articles/2005/12/07/prototype-meets-ruby-a-look-at-enumerable-array-and-hash"&gt;przypominaj&#261;cego j&#281;zyk Ruby&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;Np. poni&#380;szy kod wy&#347;wietla cztery razy okienko alertu. (Odpowiednikiem bloku kodu (ang. closure) w Ruby jest tu anonimowa funkcja).&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="number"&gt;4&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;times&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;function&lt;/span&gt;&lt;span class="punct"&gt;()&lt;/span&gt; &lt;span class="punct"&gt;{&lt;/span&gt;
  &lt;span class="ident"&gt;alert&lt;/span&gt;&lt;span class="punct"&gt;(&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;JavaScript is cool&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;)&lt;/span&gt;
&lt;span class="punct"&gt;});&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Co ciekawe, w JavaScript (podobnie jak Ruby) mo&#380;na przeci&#261;&#380;a&#263; wszystkie obiekty. Np. poni&#380;ej do klasy Array dodano metod&#281; inArray.&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="constant"&gt;Array&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;prototype&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;inArray&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;function&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;needle&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt; &lt;span class="punct"&gt;{&lt;/span&gt;
  &lt;span class="keyword"&gt;for&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;var&lt;/span&gt; &lt;span class="ident"&gt;key&lt;/span&gt; &lt;span class="keyword"&gt;in&lt;/span&gt; &lt;span class="ident"&gt;this&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt; &lt;span class="punct"&gt;{&lt;/span&gt;
    &lt;span class="keyword"&gt;if&lt;/span&gt; &lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;this&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="ident"&gt;key&lt;/span&gt;&lt;span class="punct"&gt;]&lt;/span&gt; &lt;span class="punct"&gt;===&lt;/span&gt; &lt;span class="ident"&gt;needle&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt; &lt;span class="punct"&gt;{&lt;/span&gt;
      &lt;span class="keyword"&gt;return&lt;/span&gt; &lt;span class="constant"&gt;true&lt;/span&gt;
    &lt;span class="punct"&gt;}&lt;/span&gt;
  &lt;span class="punct"&gt;}&lt;/span&gt;
  &lt;span class="keyword"&gt;return&lt;/span&gt; &lt;span class="constant"&gt;false&lt;/span&gt;
&lt;span class="punct"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;JavaScript posiada te&#380; wbudowany operator do wyra&#380;e&#324; regularnych. Np. poni&#380;szy kod sprawdza poprawno&#347;&#263; pola w formularzu:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_html "&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;
//&amp;lt;![CDATA[
var MyForm = {
  validateEmail: function() {
    if ($F('email_id').match(/^.+?@([\w\d\.-]+?\.\w{2,5})\s*$/)) {
      $('email_error').innerHTML = '';
      return true;
    } else {    
      $('email_error').innerHTML = 'Wrong email format!';
      return false;
    }
  },
  validateForm: function() {
    return this.validateEmail() ? true: false;
  }
};
//]]&amp;gt;
&amp;lt;/script&amp;gt;
&amp;lt;form action=&amp;quot;&amp;quot; method=&amp;quot;post&amp;quot; onsubmit=&amp;quot;return MyForm.validateForm()&amp;quot;&amp;gt;
  &amp;lt;table border=&amp;quot;0&amp;quot; id=&amp;quot;container&amp;quot;&amp;gt;
    &amp;lt;tr&amp;gt;
      &amp;lt;th&amp;gt;&amp;lt;label for=&amp;quot;email_id&amp;quot;&amp;gt;Email Adddress:&amp;lt;/label&amp;gt;&amp;lt;/th&amp;gt;
      &amp;lt;td&amp;gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;email_id&amp;quot; onchange=&amp;quot;MyForm.validateEmail()&amp;quot; /&amp;gt;
        &amp;lt;span id=&amp;quot;email_error&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;
      &amp;lt;/td&amp;gt;
    &amp;lt;/tr&amp;gt;
    &amp;lt;tr&amp;gt;
      &amp;lt;td colspan=&amp;quot;2&amp;quot;&amp;gt;&amp;lt;input id=&amp;quot;submit&amp;quot; type=&amp;quot;submit&amp;quot; /&amp;gt;&amp;lt;/td&amp;gt;
    &amp;lt;/tr&amp;gt;
  &amp;lt;/table&amp;gt;
&amp;lt;/form&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Jakby tego by&#322;o ma&#322;o, JavaScript w nadchodz&#261;cej &lt;a href="http://developer.mozilla.org/en/docs/New_in_JavaScript_1.7"&gt;wersji 1.7&lt;/a&gt; przejmuje troch&#281; wygodnej sk&#322;adni Pythona!&lt;/p&gt;


	&lt;p&gt;Szkoda, &#380;e taki popularny &lt;span class="caps"&gt;PHP&lt;/span&gt; wzoruje si&#281; na brzydkiej sk&#322;adni Perla,  C++ i Javy. JavaScript wybra&#322; sobie znacznie bardziej eleganckie wzorce.&lt;/p&gt;</description>
      <pubDate>Mon, 13 Nov 2006 17:56:00 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:c009fda8-0967-4000-845a-d56fd7e6d86a</guid>
      <author>Jaros&#322;aw Zabie&#322;&#322;o</author>
      <link>http://blog.zabiello.com/articles/2006/11/13/javascript-is-cool</link>
      <category>javascript</category>
      <category>prototype</category>
    </item>
  </channel>
</rss>
