13 de June, 2006

Introducción a Prototype

Hace algunos meses conversando con un amigo sobre tecnologías web como AJAX, me enteré de la existencia de prototype y decicí echarle un vistazo, al principio me pareció un tanto abstracto ya que nunca habia visto una programación de esa manera, funciones y clases anónimas, JSON, y muchos otros nuevos conceptos que un programador acostumbrado mayoritariamente a ver código PHP, a primera vista no les ve ni pies ni cabeza.

Ahondando un poco en lo que es para mi una nueva manera de programar llegué a entenderla y mejor aún, me vi envuelto en ella hasta el punto de la adicción ;) que comencé a hacer sitios web mas interactivos para el usuario aumentando el número de tareas del lado del cliente, anteriormente llevaba a cabo casi en su totalidad la acciones del lado del servidor, aceptando finalmente que en mis desarrollos anteriores hacia falta un equilibrio, equilibrio al que nunca le di importancia ya que evitaba tener que lidiar con javascript, realmente esto se acabó para mi, pq el desarrollo javascript con prototype es realmente divertido.

Creo que tu, estimado lector estarás ansioso por conocer más sobre las muy famosas pero no tan bien documentadas bondades de prototype, obviamente este artículo no cubre todos los aspectos de prototype pero si los que a mi juicio son los más importantes para comenzar, la idea es que despues de leer esto no te sea tan dificil utilizar la libreria, bueno ya dejo de hablar tanto gamelote y entonces veamos un poco de acción:

Antes de comenzar a echar código debes agregar el JavaScript con el framework al head de la página así:

<script src="prototype.js" type="text/javascript"></script>

Funciones $

La función $() es bastante útil, al principio puede parecer un poco abstracta pero cuando la utilizas la primera vez no puedes dejar de usarla, esta función es un atajo a la función del DOM document.getElementById(), que mejor explicación que un ejemplo verdad? toncs vamos a verlo…


<div id="lisa">hola mundo!</div>
<button onclick="duh();"
id="homero">clic</button>
<script>
function duh(){
    var elemento = $('lisa');
    elemento.innerHTML = 'chao mundo!';
    elemento.style.color = 'blue';
}
</script>

Tambien puede ser pasado como argumento el elemento como tal, veamos otro ejemplo


<div id="lisa">hola mundo!</div>
<div id="maggie">otro divider</div>
<button onclick="duh();" id="homero">clic</button>
<script>
function duh(){
    var elemento = $('lisa');
    var arrayElem = $('maggie', elemento); //paso dos tipos de parámetros
    for(var i=0; i<arrayElem.length;i++){
        arrayElem[i].innerHTML = 'divider ' + elemento[i].id;
        arrayElem[i].style.color = 'blue';
    }
}
</script>

en el ejemplo anterior vemos las otras dos características de la función $(), que puede recibir ademas del id de un elemento, puede recibir el propio elemento, y que si recibe mas de un elemento devuelve un array de elementos.

Función $A()

Esta función convierte a cualquier parámetro en un objeto Array, pero el objeto array de prototype no es exactamente como el array de javascript, ya que posee una extensión llamada Enumerable, la cual es una copia del lenguaje de programación Ruby, dándole mucha más versatilidad a JavaScript, veamos de que estamos hablando


<div id="lisa">hola mundo!</div>
<div id="maggie">otro divider</div>
<button onclick="duh();"
id="homero">clic</button>
<script>
function duh(){
    var listaNodos = document.getElementsByTagName('div');
    var arrayElem = $A(listaNodos);
    arrayElem.each( function(el, indice){
        el.innerHTML = indice + ':' + 'divider ' + el.id;
        el.style.color = 'blue';
    });
}

mas claro imposible.

Función $H()

Convierte un objeto en un hash enumerable


<div id="lisa">hola mundo!</div>
<button onclick="duh();"
id="homero">clic</button>
<script>
function duh(){
    var objetoUsuario = {id: 1, login: "grunch", email: "fjcalderon@gmail.com"};
    // convertimos el objeto a un hash
    var hash = $H(objetoUsuario);
    $('lisa').innerHTML = hash.toQueryString();
}
</script>

Función $F()

Esta función es muy básica, solo recibe como parámetro el id o elemento de un formulario y devuelve el valor del mismo, no merece ni un ejemplo ;)

Función Try.these()

Una función realmente útil, irá probando diferentes funciones hasta conseguir alguna que, valga la redundancia “funcione” correctamente, aca les muestro el ejemplo clásico de esta función.


<script>
function ajax() {
    return Try.these(
      function() {return new XMLHttpRequest()},
      function() {return new ActiveXObject('Msxml2.XMLHTTP')},
      function() {return new ActiveXObject('Microsoft.XMLHTTP')}
    );
}
</script>

Función document.getElementsByClassName()

Recibe como parámetro una clase CSS y devuelve un array con los elementos que tienen como atributo className la clase CSS pasada como parámetro, vamos al ejemplo

<div class=”simpson” id=”lisa”>hola mundo!</div>
<div class=”simpson” id=”maggie”>otro divider</div>
<div class=”flanders” id=”ned”>uno mas</div>
<button onclick=”duh();” id=”homero”>clic</button>
<script>
function duh(){
    var arrayNodosSimpson = document.getElementsByClassName(’simpson’);
    arrayNodosSimpson.each( function(el, indice){
        el.innerHTML = indice + ‘:’ + ‘divider ‘ + el.id;
        el.style.color = ‘blue’;
    });
}
</script>

muy util verdad? bueno, esta función era una de mis preferidas pero hace unos meses apareció una función que la destronó y ya saben lo que dicen por ahi, cuando hay santo nuevo, los viejos no hacen milagros ;)

Función $$()

Es la vedette de las funciones de prototype actualmente, su creación es simplemente una obra de arte, gracias a ella casi no uso la función anterior, recibe como parámetro un selector CSS y devuelve un array con cada elemento que cumpla con el criterio del selector dado, veamos unos ejemplos para mayor claridad


<div id="springfield"> <div class="simpson" id="lisa"><p>hola mundo!</p></div>
<div class="simpson" id="maggie"><p>otro divider</p></div>
<div class="flanders" id="ned">uno mas</div> </div>
<button onclick="duh();" id="homero">clic</button>
<div class="simpson" id="bart"><p>ay caramba!</p></div>
<script>
function duh(){
    var arrayNodosSimpson = $$('div#springfield div.simpson p');
    arrayNodosSimpson.each( function(el, indice){
        el.innerHTML = indice + ':' + 'divider ' + el.id;
        el.style.color = 'blue';
    });
}
</script>

impresionante, no? algo muy interesante es que podemos escribir nuestro código con menos lineas aun, por ejemplo


<script>
function duh(){
    $$('div#springfield div.simpson p').each( function(el, indice){
        el.innerHTML = indice + ':' + 'divider ' + el.id;
        el.style.color = 'blue';
    });
}
</script>

Todo esto se puede hacer con JavaScript sin prototype pero, en cuantas lineas? seguramente mas de 5 ;)

Creo que con esto ya tenemos una idea mas clara sobre prototype y como comenzar a programar utilizando sus bondades, hay muchas mas características de prototype pero eso te lo dejo a ti, a lo mejor en el futuro me decido a escribir otro artículo sobre este excelente framework de JavaScript, quien sabe, saludos y nos vemos por ahi.

11 Comments »

The URI to TrackBack this entry is: http://grunch.blogsome.com/2006/06/13/4/trackback/

  1. Excelente!. Pondre este articulo en mis favoritos, porque de seguro me sera de mucha ayuda.

    Saludos, y sigue publicando cosas.

    Comment by Miguel Aguero — 13 de June, 2006 @ 3:43 pm

  2. Excelente introducción al framework!!
    Muchas gracias por el articulo y espero que hayan más en el futuro.
    Saludos!

    Comment by Jose Luis Ressia — 15 de June, 2006 @ 1:45 pm

  3. gracias por sus comentarios :)

    Comment by grunch — 15 de June, 2006 @ 2:17 pm

  4. Muy buena introducción a prototype, te animo a seguir publicando.
    Por cierto la función $$() no está disponible para la 1.4.0, no?

    Comment by jlbarrera — 20 de June, 2006 @ 10:02 am

  5. No, la función $$() es exclusiva de la versión 1.5, la puedes descargar con las librerias de scriptaculous en su versión 1.6.1, saludos

    Comment by grunch — 21 de June, 2006 @ 1:04 pm

  6. En el ejemplo que pones de la función $$() la referencia el.id no funciona (muestra blanco) probado en IE y Firefox, lo cual me lleva a otra pregunta… ¿como se pueden averiguar los elementos que contiene un objeto, sin mirar el código? Osea, en el objeto el que recibes, como sabes que propiedades tienes?

    Comment by Mate — 22 de June, 2006 @ 10:57 am

  7. el ejemplo de $$() si funciona, revisa bien que el codigo esté exactamente igual, con respecto a tu otra pregunta, puedes saber los atributos de cada elemento leyendo la información de DOM de javascript, la documentación oficial está en www.w3.org

    Comment by grunch — 22 de June, 2006 @ 12:31 pm

  8. Me sigue sin funcionar, pese a que me parece lógica la manera de acceder. Incluso he probado sustituyendo por el[”id”] y no hay manera.
    En cuanto a la otra cuestión, mi pregunta iba más encaminada a si no había alguna manera de recorrer un objeto (como la variable EL del ejemlo). Con prototype y .each no funciona (o no lo he conseguido).

    Comment by Mate — 22 de June, 2006 @ 1:50 pm

  9. tienes razon, no te muestra el ID pq mediante la funcion $$() estas obteniendo el elemento ‘p’, y tal elemento no tiene id, si quieres ver el id del padre puedes colocar la función de esta manera

    function duh(){
    var arrayNodosSimpson = $$(’div#springfield div.simpson p’);
    arrayNodosSimpson.each( function(el, indice){
    el.innerHTML = indice + ‘:’ + ‘divider ‘ + el.parentNode.id;
    el.style.color = ‘blue’;
    });
    }

    y sobre tu pregunta de recorrer el objeto como si fuera un array, claro que es posible, se hace de esta manera

    for (var propiedad in el) {
    alert(propiedad);
    }

    donde “el” es el elemento, espero haberte ayudado, saludos

    Comment by grunch — 22 de June, 2006 @ 2:18 pm

  10. Excelente ,man lo que estaba buscando , sigue publicando , saludos

    Comment by Seinku-K — 23 de June, 2006 @ 1:26 am

  11. Esta muy buena esta pequeña introducción pero la funcion $$() no me queda bien claro, de ser pusible sea mas detallado en esta explicación

    Gracias

    Comment by Reinaldo — 13 de February, 2008 @ 4:12 pm

RSS feed for comments on this post.

Leave a comment

Line and paragraph breaks automatic, e-mail address never displayed, HTML allowed: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>