<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/css" href="/stylesheets/rss.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>Drogomir: jQuery vs Prototype</title>
    <link>http://blog.drogomir.com/articles/2007/09/04/jquery-vs-prototype</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description></description>
    <item>
      <title>jQuery vs Prototype</title>
      <description>&lt;p&gt;Kilka dni temu wrzuci&#322;em &lt;a href="http://blog.drogomir.com/articles/2007/08/31/dlaczego-jquery"&gt;notk&#281; promuj&#261;c&#261; jQuery&lt;/a&gt;. Cz&#281;sto podczas por&#243;wnywania narz&#281;dzi prze&#380;ywam pewien rodzaj euforii, kt&#243;ra nie pozwala mi na obiektywne rozpatrzenie wszystkich za i przeciw. Przez chwil&#281; wydaje mi si&#281;, &#380;e znalaz&#322;em narz&#281;dzie idealne (co oczywi&#347;cie jest okropnym nadu&#380;yciem. jak og&#243;lnie wiadomo idealny jest tylko polski rz&#261;d i jego sukcesy na przestrzeni ostatnich 2 lat &amp;#8211; widzia&#322;em w reklamach).&lt;/p&gt;


	&lt;p&gt;W ka&#380;dym razie och&#322;on&#261;&#322;em troch&#281; i ze spokojem buddyjskiego mnicha (m&#243;wi&#322;em ju&#380;, &#380;e jestem oaz&#261; spokoju?) przetrz&#261;sn&#261;&#322;em ca&#322;y internet w poszukiwaniu informacji. Pr&#243;bowa&#322;em nawet wywo&#322;a&#263; flamewara na google groups. I biednie jest. Niewiele znalaz&#322;em. Wsz&#281;dzie jakie&#347; artyku&#322;y, kt&#243;rych sens jest mniej wi&#281;cej taki: &amp;#8220;Przez d&#322;ugi czas u&#380;ywa&#322;em prototype(jQuery) i stwierdzi&#322;em, &#380;e musz&#281; da&#263; jQuery(prototype) szans&#281;. jQuery jest prototype killerem!&amp;#8221;. Nie licz&#261;c fajnego artyku&#322;u &lt;a href="http://blogs.pathf.com/agileajax/2007/08/jquery-vs-proto.html"&gt;na agile ajax&lt;/a&gt;. Stety albo niestety autor nie do ko&#324;ca chce wyjawi&#263;, kt&#243;re podej&#347;cie jest dla niego lepsze. Aczkolwiek pewn&#261; wskaz&#243;wk&#261; mo&#380;e by&#263; przesiadka na jQuery, a nie odwrotnie.&lt;/p&gt;


	&lt;p&gt;No i &lt;a href="http://alternateidea.com/blog/articles/2006/05/23/prototype-inheritance-madness"&gt;krytyka modelu dziedziczenia zastosowanego w prototype&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;Pozwoli&#322;em sobie zrobi&#263; w&#322;asne por&#243;wnanie. Mam nadziej&#281;, &#380;e chocia&#380; w ma&#322;ym procencie obiektywne. ;-)&lt;/p&gt;


	&lt;h3&gt;Manipulacja &lt;span class="caps"&gt;DOM&lt;/span&gt; i &lt;span class="caps"&gt;CSS&lt;/span&gt;&lt;/h3&gt;


	&lt;p&gt;Na tym polu zdecydowanie wygrywa jQuery. Tw&#243;rca zapewni&#322; co&#347;, co nazywa si&#281; &amp;#8220;chainability&amp;#8221;. Metody manipuluj&#261;ce elementami HTMLa mo&#380;na wywo&#322;ywa&#263; w &#322;a&#324;cuchach, na przyk&#322;ad &lt;code&gt;jQuery('#some').show('slow').css('background-color', 'white').add('&amp;lt;p&amp;gt;Dodatkowy paragraf!&amp;lt;/p&amp;gt;')&lt;/code&gt;.&lt;/p&gt;


	&lt;p&gt;Je&#380;eli chodzi o same selektory, to od wersji 1.5.0 prototype ma obs&#322;ug&#281; selektor&#243;w &lt;span class="caps"&gt;CSS&lt;/span&gt;, wi&#281;c nie ma ju&#380; problemu z wybieraniem element&#243;w w bardzo fiku&#347;nych konfiguracjach ;-)&lt;/p&gt;


	&lt;p&gt;jQuery ma jeszcze jedn&#261; ciekaw&#261; w&#322;a&#347;ciwo&#347;&#263;. Wybrane elementy zawsze zwracane s&#261; w tablicy dzi&#281;ki czemu biblioteka sama zadba o przeiterowanie po kolekcji i zaaplikowaniu metody do ka&#380;dego jej elementu. Na przyk&#322;ad zamiast napisa&#263; (prototype):&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;
$$('a').each(function(v, i) { Event.observe(v, 'click', fn); });
&lt;/code&gt;&lt;/pre&gt;

Mo&#380;emy u&#380;y&#263;:
&lt;pre&gt;&lt;code&gt;
jQuery('a').click(fn);
&lt;/code&gt;&lt;/pre&gt;

	&lt;h3&gt;Wydajno&#347;&#263;&lt;/h3&gt;


	&lt;p&gt;Na tym polu prototype mocno dawa&#322; w ko&#347;&#263; jQuery, ale sytuacja si&#281; poprawi&#322;a. W poprzednim po&#347;cie zamie&#347;ci&#322;em 2 screeny, na kt&#243;rych mo&#380;na zauwa&#380;y&#263;, &#380;e obecnie jQuery jest jakie&#347; 2 razy wolniejsza (oczywi&#347;cie je&#380;eli chodzi o same selektory). Dla innych metod podejrzewam, &#380;e b&#281;dzie podobnie (dla each i map na pewno &amp;#8211; je&#380;eli kto&#347; si&#281; bardzo nudzi mo&#380;e si&#281; pobawi&#263; i zrobi&#263; wi&#281;cej benchmark&#243;w).&lt;/p&gt;


	&lt;p&gt;Ale statystyki na szcz&#281;&#347;cie nie zawsze oddaj&#261; to, co dzieje si&#281; w rzeczywisto&#347;ci. Je&#380;eli kto&#347; dysponuje odpowiednio wolnym komputerem (kilkaset mhz najlepiej), &#322;atwo mo&#380;e sprawdzi&#263;, &#380;e efekty napisane w &lt;a href="http://script.aculos.us"&gt;script.aculo.us&lt;/a&gt; bardziej &amp;#8220;mul&#261;&amp;#8221; kompa ni&#380; ich odpowiedniki w jQuery (linux, firefox2 &amp;#8211; wydaje mi si&#281;, &#380;e na innych systemach i przegl&#261;darkach b&#281;dzie podobnie). Szczeg&#243;lnie wida&#263; t&#261; r&#243;&#380;nic&#281; przy wszelakich tworach drag&amp;#38;drop.&lt;/p&gt;


	&lt;h3&gt;Rozszerzenia&lt;/h3&gt;


	&lt;p&gt;W tym miejscu wystarczy spojrze&#263; na &lt;a href="http://docs.jquery.com/Plugins"&gt;list&#281; rozszerze&#324; dla jQuery&lt;/a&gt;. Tego chyba nic w tej chwili  nie pobije. Rozszerzenia z zakresu UI dla prototypa (a w&#322;a&#347;ciwie script.aculo.us) wygl&#261;daj&#261; biednie w takim por&#243;wnaniu.&lt;/p&gt;


	&lt;p&gt;Du&#380;y plus dla jQuery.&lt;/p&gt;


	&lt;h3&gt;Spo&#322;eczno&#347;&#263;&lt;/h3&gt;


	&lt;p&gt;jQuery jest niew&#261;tpliwie bibliotek&#261; popularniejsz&#261;. Niekt&#243;rzy m&#243;wi&#261;, &#380;e to chwilowy buzz (znowu ulegam modzie frameworkowej? :).&lt;/p&gt;


	&lt;p&gt;Prototype z kolei, chocia&#380; mniej popularny, ma mocne wsparcie w spo&#322;eczno&#347;ci RoR i wsparcie Rails Core Team. Podobno niekt&#243;rzy pracuj&#261; nad czym&#347; co mo&#380;na nazwa&#263; &amp;#8220;jQuery on Rails&amp;#8221;, ale nadal prototype jako jedyny jest dost&#281;pny &amp;#8220;out of the box&amp;#8221;.&lt;/p&gt;


	&lt;h3&gt;Rozszerzenia j&#281;zyka.&lt;/h3&gt;


	&lt;p&gt;Prototype dodaje do javascriptu bardzo du&#380;o metod, wzorowanych na metodach rubiego,  u&#322;atwiaj&#261;cych prac&#281; z wbudowanymi typami. Mi&#281;dzy innymi modu&#322; Enumerable, Hash, sporo metod do String, Date i du&#380;o du&#380;o wi&#281;cej.&lt;/p&gt;


	&lt;p&gt;jQuery z kolei udost&#281;pnia tylko kilka metod (each, map, trim, grep&amp;#8230;). Oczywi&#347;cie mo&#380;na doda&#263; swoje metody, ale w tym miejscu trzeba wspomnie&#263; o filozofii jQuery.&lt;/p&gt;


	&lt;p&gt;Prototype dodaje nowe metody do poszczeg&#243;lnych klas, dzi&#281;ki czemu mo&#380;na napisa&#263; na przyk&#322;ad:&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;
['a', 'b', 'c'].each(function(v, i) { alert(v); });
&lt;/code&gt;&lt;/pre&gt;

	&lt;p&gt;W jQuery wygl&#261;da&#322;oby to w ten spos&#243;b:&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;
jQuery.each(['a', 'b', 'c'], function(v, i) { alert(v); });
&lt;/code&gt;&lt;/pre&gt;

	&lt;p&gt;Jeszcze nie jestem do ko&#324;ca pewien, kt&#243;re podej&#347;cie mi bardziej pasuje. By&#263; mo&#380;e po&#322;&#261;czenie jQuery z podej&#347;ciem prototype?&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;
jQuery.extend(Array.prototype, {
  each: function(iterator) {
    jQuery.each(this, iterator);
  }
});
&lt;/code&gt;&lt;/pre&gt;

	&lt;p&gt;I ju&#380; mo&#380;na u&#380;y&#263; konstrukcji analogicznej do prototype. Po paru zmianach mo&#380;na doda&#263; te&#380; reszt&#281; funkcji z Enumerable &amp;#8211; po odpowiednim przygotowaniu potrzeba niewiele wi&#281;cej ni&#380; copy&amp;#38;paste. Podobnie &#322;atwo b&#281;dzie z reszt&#261; rozszerze&#324;.&lt;/p&gt;


	&lt;p&gt;Mo&#380;na r&#243;wnie&#380; zosta&#263; przy podej&#347;ciu jQuery i napisa&#263; metody dzia&#322;aj&#261;ce mniej wi&#281;cej tak:&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;
jQuery.collect(arr, function(v, i) { /* jaki&#347; kod */});
&lt;/code&gt;&lt;/pre&gt;

	&lt;p&gt;&lt;ins&gt;Chwil&#281; po dodaniu tego posta przypadkiem trafi&#322;em na fajny artyku&#322;, kt&#243;ry pokazuje dlaczego &lt;a href="http://mg.to/2006/05/20/prototype-vs-web-2-0"&gt;podej&#347;cie a&amp;#8217;la prototype jest po ciemnej stronie mocy&lt;/a&gt; ;-)&lt;/ins&gt;&lt;/p&gt;


	&lt;p&gt;W nast&#281;pnym po&#347;cie opisz&#281; jak mo&#380;na to szybko, &#322;atwo i przyjemnie zrobi&#263;. (o ile starczy mi czasu i samozaparcia)&lt;/p&gt;


	&lt;p&gt;Od wersji 1.6.0 prototype dostanie te&#380; par&#281; bardzo przydatnych funkcji i narz&#281;dzi. Mi&#281;dzy innymi DOMBuilder, custom events, wrap() &amp;#8211; bardzo podobaj&#261; mi si&#281; takie smaczki. Wi&#281;cej informacji w &lt;a href="http://www.prototypejs.org/2007/8/15/prototype-1-6-0-release-candidate"&gt;notce na stronie prototype&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;Podsumowuj&#261;c ten punkt, je&#380;eli chcemy intensywnie korzysta&#263; z wymienionych powy&#380;ej metod (polecam przejrze&#263; &lt;a href="http://www.prototypejs.org/api/"&gt;dokumentacj&#281; prototype&lt;/a&gt;) lepszym wyborem b&#281;dzie prototype. Z zaznaczeniem, &#380;e sporo z tych funkcji mo&#380;na bardzo &#322;atwo przenie&#347;&#263; do jQuery ;-)&lt;/p&gt;


	&lt;h3&gt;Materia&#322;y&lt;/h3&gt;


	&lt;p&gt;Przez pewien czas, dawno dawno temu, prototype nie mia&#322; prawie dokumentacji, co mog&#322;o niekt&#243;rych zniech&#281;ca&#263;. Aktualnie mo&#380;na powiedzie&#263;, &#380;e zar&#243;wno prototype, jak i script.aculo.us s&#261; dobrze udokumentowane i raczej nikt nie b&#281;dzie mia&#322; problemu z nauk&#261;. Tak samo zreszt&#261; jest z jQuery.&lt;/p&gt;


	&lt;p&gt;Oba framweorki doczaka&#322;y si&#281; ksi&#261;&#380;ek.&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;jQuery: 
	&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://www.amazon.com/Learning-jQuery-Interaction-Development-JavaScript/dp/1847192505/ref=pd_bbs_sr_1/102-4639170-4767356?ie=UTF8&amp;#38;s=books&amp;#38;qid=1188905165&amp;#38;sr=8-1"&gt;Learning jQuery&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://www.amazon.com/jQuery-Reference-Guide-Karl-Swedberg/dp/1847193811/ref=pd_bbs_sr_2/102-4639170-4767356?ie=UTF8&amp;#38;s=books&amp;#38;qid=1188905165&amp;#38;sr=8-2"&gt;jQuery Reference Guide&lt;/a&gt;&lt;/li&gt;
	&lt;/ul&gt;
	&lt;/li&gt;
		&lt;li&gt;prototype:
	&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://www.amazon.com/Prototype-Scriptaculous-Action-Dave-Crane/dp/1933988037/ref=pd_bbs_sr_1/102-4639170-4767356?ie=UTF8&amp;#38;s=books&amp;#38;qid=1188905195&amp;#38;sr=8-1"&gt;Prototype and Scriptaculous in Action&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://www.amazon.com/Prototype-script-aculo-us-Never-JavaScript-Could/dp/1934356018/ref=pd_bbs_2/102-4639170-4767356?ie=UTF8&amp;#38;s=books&amp;#38;qid=1188905195&amp;#38;sr=8-2"&gt;Prototype and script.aculo.us: You Never Knew JavaScript Could Do This!&lt;/a&gt;&lt;/li&gt;
	&lt;/ul&gt;&lt;/li&gt;
	&lt;/ul&gt;


	&lt;h3&gt;Podsumowanie&lt;/h3&gt;


	&lt;p&gt;Ci&#281;&#380;ko mi wybra&#263; ten lepsiejszy framework. I na pewno wyb&#243;r ten nie b&#281;dzie obiektywny &amp;#8211; ka&#380;dy musi sam rozwa&#380;y&#263; czego oczekuje po bibliotece.&lt;/p&gt;


	&lt;p&gt;Wydaje mi si&#281;, &#380;e przy projekcie, kt&#243;ry w tym momencie zaczynam bardziej sprawdzi si&#281; jQuery. Mam w g&#322;owie u&#322;o&#380;ony zaawansowany interfejs u&#380;ytkownika i nie chcia&#322;bym &#380;adnych zgrzyt&#243;w, a jak pokazuje przyk&#322;ad scriptaculous, p&#322;ynno&#347;&#263; r&#243;&#380;nych efekt&#243;w nie ma wiele wsp&#243;lnego z szybko&#347;ci&#261; biblioteki.&lt;/p&gt;


	&lt;p&gt;Z drugiej strony je&#380;eli kto&#347; uwa&#380;a, &#380;e b&#281;dzie wykonywa&#322; po stronie u&#380;ytkownika sporo oblicze&#324;, p&#281;tli, dzia&#322;ania na du&#380;ych tablicach itp. itd. prawdopodobnie dobrym wyborem b&#281;dzie prototype &amp;#8211; nie do&#347;&#263;, &#380;e jest &#322;atwiej wykonywa&#263; te czynno&#347;ci, to jeszcze wszystko dzia&#322;a szybciej.&lt;/p&gt;


	&lt;p&gt;Mam nadziej&#281;, &#380;e powy&#380;szy opis pomo&#380;e w wybraniu biblioteki lepszej do rozwi&#261;zania danego problemu. Je&#380;eli pomin&#261;&#322;em jakie&#347; soczyste w&#322;a&#347;ciwo&#347;ci kt&#243;rej&#347; z bibliotek prosz&#281; o komentarz &amp;#8211; uzupe&#322;ni&#281; por&#243;wnanie :)&lt;/p&gt;</description>
      <pubDate>Tue, 04 Sep 2007 14:10:00 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:95d24202-6bf8-4d00-8e77-1a0c489cb371</guid>
      <author>Piotr Sarnacki</author>
      <link>http://blog.drogomir.com/articles/2007/09/04/jquery-vs-prototype</link>
      <category>Javascript</category>
      <category>jQuery</category>
      <category>javascript</category>
      <category>prototype</category>
      <category>framework</category>
      <category>scriptaculous</category>
      <category>por&#243;wnanie</category>
      <trackback:ping>http://blog.drogomir.com/articles/trackback/30</trackback:ping>
    </item>
  </channel>
</rss>
