<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	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/"
	>

<channel>
	<title>Activ - Centro de Capacitación Autorizado por Adobe enfocado a Cursos de HTML5, jQuery, Javascript, CSS, Usabilidad, SEO, Mobile, Flex, Flash, ActionScript y demás tecnologías. &#187; javascript</title>
	<atom:link href="http://activ.com.mx/tag/javascript/feed/" rel="self" type="application/rss+xml" />
	<link>http://activ.com.mx</link>
	<description>Adobe Authorized Training Center</description>
	<lastBuildDate>Tue, 21 May 2013 23:11:50 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<item>
		<title>Usando Parse.com con PhoneGap &#8211; Parte 2</title>
		<link>http://activ.com.mx/usando-parse-com-con-phonegap-parte-2/</link>
		<comments>http://activ.com.mx/usando-parse-com-con-phonegap-parte-2/#comments</comments>
		<pubDate>Thu, 16 May 2013 14:10:36 +0000</pubDate>
		<dc:creator>gr_maggi</dc:creator>
				<category><![CDATA[Adobe]]></category>
		<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[Dreamweaver]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[adobe]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[dreamweaver]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[phonegap]]></category>

		<guid isPermaLink="false">http://activ.com.mx/?p=5508</guid>
		<description><![CDATA[La recepción celular es tu talón de Aquiles Tan poderoso como nuestros pequeños dispositivos móviles, tienen una debilidad. No, no es la criptonita roja. Es la fuerza de la señal. Yo vivo en una ciudad de tamaño medio y todavía encuentro áreas donde mi teléfono misteriosamente deja de cargar datos. Es frustrante, pero lo que [...]]]></description>
				<content:encoded><![CDATA[<h2>La recepción celular es tu talón de Aquiles</h2>
<p>Tan poderoso como nuestros pequeños dispositivos móviles, tienen una <strong>debilidad</strong>. No, no es la criptonita roja. Es la fuerza de la señal. Yo vivo en una ciudad de tamaño medio y todavía encuentro áreas donde mi teléfono misteriosamente deja de cargar datos. Es frustrante, pero lo que hace más frustrante situaciones como ésta, son aplicaciones que no manejan correctamente el <strong>estado <em>offline.</em></strong></p>
<div style="text-align:center"> <img src="http://activ.com.mx/wp-content/uploads/2013/02/iphone_parse.jpg" alt="iphone_parse" width="200" height="220" class="aligncenter size-full wp-image-5471" /></div>
<p>Ciertamente algunas aplicaciones no pueden hacer mucho realmente si no están <em>online.</em> Siendo capaz de reconocer tu <strong>conexión de red</strong> y manejar los <strong>cambios</strong> es la marca de una aplicación superior. Vamos a empezar haciendo algunas modificaciones básicas en nuestra aplicación para manejar la comprobación de la conexión inicial, así como un cambio en la conexión.</p>
<p><span id="more-5508"></span></p>
<pre>function onDeviceReady(e) {
    $(document).on("online", onlineFunc);
    $(document).on("offline", offlineFunc);
    if(!(navigator.connection.type === Connection.UNKNOWN &amp;&amp; navigator.connection.type === Connection.NONE)) {
        $(document).trigger("online");
    } else {
        $(document).trigger("offline");
    }
}</pre>
<p>El anterior fragmento de código es una porción del evento onDeviceReady. Si no has usado PhoneGap antes, esto puede ser nuevo para ti. Básicamente, cualquier código que hace uso de las características del dispositivo necesita esperar por un evento &quot;device-ready&quot; para ser disparado por el framework fundamental de PhoneGap. En la aplicación del ejemplo anterior, confiamos en el evento ready del documento jQuery.  En este ejemplo, remplazaremos el código JavaScript, en <em>main.js</em>, con el código anterior.</p>
<p>Comienza agregando dos manejadores de eventos para el objeto del documento: uno para online y otro para offline. Como tú probablemente adivinaras, estos manejadores responden al cambio de estado de tu conexión.</p>
<p>Primero, necesitamos revisar el estatus actual. El objeto <a href="http://docs.phonegap.com/en/2.3.0/cordova_connection_connection.md.html#Connection">Connection</a> de PhoneGap proporciona una manera sencilla para comprobar la conectividad del dispositivo. El valor de <em>navigator.connection.type</em> es uno de </p>
<ul>
<em></p>
<li>Connection.UNKNOWN</li>
<li>Connection.ETHERNET</li>
<li>Connection.WIFI</li>
<li>Connection.CELL_2G</li>
<li>Connection.CELL_3G</li>
<li>Connection.CELL_4G</li>
<li>Connection.NONE</li>
<p></em>
</ul>
<p>Con estos valores, puedes ver si el usuario tiene alguna conectividad así como fuerza relativa de la conexión. Esto es útil para decidir si tiene sentido descargar grandes archivos multimedia por ejemplo. Que es una buena idea en una conexión 4G o no necesariamente en una conexión 2G. Para nuestras necesidades simplemente nos preocuparemos si no hay  conexión en absoluto. También tomamos la visión pesimista si no podemos determinar la conexión en todos (Connection.UNKNOWN) entonces asumimos que el dispositivo no está conectado. Ahora vamos a revisar los manejadores.</p>
<pre>
var parse_init = false;
var online;
function offlineFunc(e) {
    console.log('offline');
    online=false;
    navigator.notification.alert("You are offline. Posting notes have been disabled.", null, "Offline!");
    addNoteButton.attr("disabled","disabled");
    if(geoWatch) navigator.geolocation.clearWatch(geoWatch);
}
function onlineFunc(e) {
    console.log('online');
    online=true;
    if(!parse_init) {
        initParse();
        getNotes();
    }
    geoWatch = navigator.geolocation.watchPosition(onGeo, onGeoError, { timeout: 30000 });
    addNoteButton.removeAttr("disabled");
}
</pre>
<p>Tenemos unas cuantas cosas pasando en ambos manejadores, así que tomémoslo paso a paso. El manejador de la primera línea establece una variable global (online) en false. Esta será usada en otra parte. (Si, podemos revisar y re-utilizar la conexión que teníamos antes, pero esto parecía una solución más simple). Después, notificamos al usuario que, debido a que el dispositivo está offline, la funcionalidad se ha desactivado. PhoneGap tiene una API de <a href="http://docs.phonegap.com/en/2.3.0/cordova_notification_notification.md.html#Notification">Notificación</a> que es perfecta para esto.(Como un bono adicional, puedes usar la misma API para hacer vibrar el teléfono para asegurarse de que el usuario realmente reciba el mensaje). Después de la notificación, se deshabilitara el botón que se usa para agregar notas. Y por último, se limpiaran todas las actividades de geolocalización que el dispositivo puede estar haciendo.</p>
<p>Ahora dirige tu atención a la línea del manejador. Como antes, se actualiza una variable global que refleja el estado de conexión. El siguiente bloque se encarga de la inicializacin Parse. Como esto sólo se puede ejecutar una vez, se comprueba el valor de parse_init para ver si ya se ha establecido. Como hemos mencionado anteriormente sería parte de nuestra actualización, la llamada de watchPosition aquí le pedirá al dispositivo reportar la posición actual del usuario y sus cambios. Finalmente, removemos el atributo disabled´(si se encuentra) desde el botón utilizado para agregar notas.</p>
<p>La función de initParse() simplemente contiene la lógica de la configuración de análisis que se detalla en el <a href="//activ.com.mx/usando-parse-com-con-phonegap/”">artículo anterior</a>:</p>
<pre>
function initParse() {
    Parse.initialize(PARSE_APP, PARSE_JS);
    NoteObject = Parse.Object.extend("NoteObject");
    parse_init=true;
}
</pre>
<h2>Agregar Geolocalización </h2>
<p>Ya has visto que el apoyo de geocalización se añadió, tanto a los manejadores online y offline, pero echemos un vistazo a cómo estos datos se utilizan realmente en la aplicación. El manejador online hace uso de la característica &quot;watch&quot; en la Geolocalización. Este usara el GPS del dispositivo para averiguar la ubicación del usuario así como el manejo de cualquier cambio en la ubicación. Cuando configuro el watch, especifico onGeo para el manejo exitoso y onGeoError para cualquier error. Porque nosotros queremos agregar la ubicación a los objetos de nota como <em>enhancement</em>, el manejador onGeoError actualmente no hace nada en absoluto (en lugar de causar un error, simplemente dejamos datos de geolocalización).</p>
<pre> 
function onGeoError() {
    //So yeah, do nothing and I'm ok with that.
}
</pre>
<p>Obviamente podría hacer algo más aquí si quisieras, pero por ahora lo dejaremos así. El manejador de éxito copiara los valores dentro de una variable global.</p>
<pre>
var geoPoint;
function onGeo(g) {
    geoPoint = {latitude:g.coords.latitude, longitude:g.coords.longitude};
}</pre>
<p>Ahora que hemos obtenido la ubicación del usuario, ¿cómo la usamos?. Podríamos simplemente pasarla dentro de datos almacenados con Parse. Recuerda, Parse te permite almacenar <em>cualquier cosa</em>. Pero en su lugar, tomaremos ventaja del soporte especial de Parse para manejar objetos de ubicación. Veamos el manejador disparado cuando el usuario da clic al botón Add Note.</p>
<pre>
$("#addNoteBtn").on("touchend", function(e) {
    e.preventDefault();
    //Grab the note details, no real validation for now
    var title = $("#noteTitle").val();
    var body = $("#noteBody").val();
    var note = new NoteObject();
    note.set("title", title);
    note.set("body", body);
    //if we have _some_ data
    if(geoPoint.longitude) {
        note.set("position", new Parse.GeoPoint({latitude:geoPoint.latitude, longitude:geoPoint.longitude}));
    }
    note.save(null, {
        success:function(object) {
            console.log("Saved the object!");
            $("#noteTitle").val("");
            $("#noteBody").val("");
            getNotes();
        }, 
        error:function(object,error) {
            console.dir(error);
            alert("Sorry, I couldn't save it.");
        }
    });
});</pre>
<p>Hemos hecho dos cambios importantes al manejador. Primero, ya no se pasan los datos en una estructura para el primer argumento de save() -nota que es nulo ahora. En su lugar, usamos el API set() en el objeto nota para establecer nuestros valores. Podemos entonces usar un condicional sencillo para ver si tenemos la ubicación del usuario. Si es así, la pasamos a una nueva instancia de Parse.GeoPoint. Usando un GeoPoint, permite que la aplicación haga un número de geolozaclizaciones basadas en consultas. Mientras que no se usara esta aplicación de prueba, podríamos usar el API de Parse para consultar las notas publicadas dentro de cierta distancia de una ubicación. Esto es muy interesante y Parse lo hace increíblemente fácil.</p>
<h2>Mostrar la ubicación de la nota</h2>
<p>Ahora que tenemos datos de ubicación disponibles con nuestra nota de texto básica, ¿cómo hacemos uso de estos? Una forma seria mostrarlos en un mapa. Google proporciona soporte de mapeo comprehensivo, pero para nuestros propósitos podemos hacer uso del <a href="https://developers.google.com/maps/documentation/staticmaps/">API de Mapas Estáticos</a>. Esta API proporciona un mapeo básico que no requiere interactividad. Al crear una URL que incluye la ubicación y otros parámetros, se puede crear un mapa sencillo que muestra una imagen básica. Pero, ¿dónde lo hacemos?.</p>
<p>Uno de las adiciones más recientes a PhoneGap (en la versión 2.3.0) es el API <a href="http://docs.phonegap.com/en/2.3.0/cordova_inappbrowser_inappbrowser.md.html#InAppBrowser">InAppBrowser</a>. Esencialmente, permite la creación de una ventana <em>encima</em> de tu aplicación. Esto es útil para tareas como visualizar paginas en un contexto fuera de la aplicación. Incluso proporciona múltiples &#8216;ganchos&#8217; que notifican cuando se carga una página y cuando el usuario cierra la ventana. Por suerte para nosotros, nuestras necesidades son mucho más sencillas. Revisemos la versión modificada de la función getNotes.</p>
<pre>
function getNotes() {
    var query = new Parse.Query(NoteObject);
    query.find({
        success:function(results) {
            console.dir(results);
            var s = "";
            for(var i=0, len=results.length; i&lt;len; i++) {
                var note = results[i];
                s += &quot;<p>";
                s += "<b>"+note.get("title")+"</b><br />";
                s += "<b>Written "+note.createdAt + "</b><br />";
                //Do we have a geo point?
                if(note.has("position")) {
                    var pos = note.get("position");
                    s += "<a href="" class="navLink">View on Map</a><br />";
                }
                s += note.get("body");
                s += "</p>";
            }
            $("#notes").html(s);
        },
        error:function(error) {
            alert("Error when getting notes!");
        }
    });
}
</pre>
<p>El cambio comienza en el resultado del ciclo. He agregado nuevo código para manejar la existencia de un valor de posición. Recuerda, no todos nuestros datos deben tenerla. Si existe, se agrega más HTML al resultado. Esto incluye un simple enlace HTML con una clase de navLink. Además, nota el uso de atributos de datos para almacenar los valores de posición. Para hacer que estos enlaces funcionen he agregado un manejador de eventos solo para los eventos táctiles sobre estos.</p>
<pre>
$(document).on("touchend", ".navLink", function(e) {
    e.preventDefault();
    //If we are offline, say we're sorry and move on..
    if(!online) {
        navigator.notification.alert("Maps can only be viewed online.", null, "Offline!");
        return;
    }
    //Get the position from the data attribute
    var long = $(this).data("longitude");
    var lat = $(this).data("latitude");
    //Generate Google Static Map API link
    var link = "http://maps.googleapis.com/maps/api/staticmap?center="+lat+","+long+"&amp;zoom=13&amp;size=400x400&amp;maptype=roadmap&amp;markers=color:red%7Ccolor:red%7C"+lat+","+long+"&amp;sensor=false";
    window.open(link, "blank");
});
</pre>
<p>Después de bloquear los eventos normales para enlaces, el código se asegura de que el usuario este online. Si no lo está, se le notifica al usuario. A continuación, tomamos los datos de ubicación desde el HTML y creamos un link usando el API de Mapas Estáticos. Incluso si es tu primera vez viendo esta API, deberías tener una buena idea de lo que hace este enlace. Finalmente, el enlace se abre usando el API tradicional window.open. Así es como se ve el contenido en el simulador de iOS:</p>
<p style="text-align:center"><img src="http://activ.com.mx/wp-content/uploads/2013/03/using-parse-with-phonegap-part-2-the-phone-strikes-back-fig01.jpg" alt="Registro de notas" /></p>
<p>Así se ve el contenido cuando el usuario presiona en enlace &#8220;View on Map&#8221;:</p>
<p style="text-align:center"><img src="http://activ.com.mx/wp-content/uploads/2013/03/fig02.jpg" alt="Mapa Estatico" /></p>
<p>Nota como el API InAppBrowser crea el navegador típico de manera automática. También hay un botón &quot;Done&quot; para cerrar la ventana. Lo que no es obvio en las imágenes de arriba, es la transición cuando se abre y cierra la ventana.</p>
<h2>A dónde ir desde aquí</h2>
<p>Para carga de datos offline con Parse, hay una forma simple de mantener un respaldo de los datos del usuario para que sean accesibles incluso si pierde su dispositivo. Al usar PhoneGap, se tiene acceso al estado de la conexión del dispositivo así como su ubicación por GPS. Puedes tomar este código de ejemplo para subirlo a PhoneGap Build y usarlo en tu propia aplicación!</p>
<p>La versión original de este artículo está publicada en <a href="http://www.adobe.com/devnet/phonegap/articles/using-parse-with-phonegap-part-2-the-phone-strikes-back.html">Adobe Devnet</a> bajo licencia Creative Commons, fue traducido y adaptado en nuestro blog por <a href="https://twitter.com/gr_maggi">Margarita García</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://activ.com.mx/usando-parse-com-con-phonegap-parte-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cross-browser testing con Adobe Edge Inspect</title>
		<link>http://activ.com.mx/cross-browser-testing-con-adobe-edge-inspect/</link>
		<comments>http://activ.com.mx/cross-browser-testing-con-adobe-edge-inspect/#comments</comments>
		<pubDate>Sat, 04 May 2013 06:01:11 +0000</pubDate>
		<dc:creator>jesus_macedo</dc:creator>
				<category><![CDATA[Adobe]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[adobe]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[dreamweaver]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[iPad]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[mobile]]></category>

		<guid isPermaLink="false">http://activ.com.mx/?p=5334</guid>
		<description><![CDATA[Si alguna vez has construido un sitio web móvil, sabrás que el probar y depurar a través de múltiples dispositivos puede ser engorroso y, en ocasiones, doloroso. Adobe Edge Inspect ayuda a resolver esto al permitirte controlar fácilmente la navegación a través de múltiples dispositivos. Complementa tu flujo de trabajo con herramientas de depuración e [...]]]></description>
				<content:encoded><![CDATA[<p>Si alguna vez has construido un sitio web móvil, sabrás que el <strong>probar</strong> y <strong>depurar</strong> a través de múltiples dispositivos puede ser engorroso y, en ocasiones, doloroso. <strong>Adobe Edge Inspect</strong> ayuda a resolver esto al permitirte controlar fácilmente la navegación a través de múltiples dispositivos. Complementa tu <strong>flujo de trabajo </strong>con herramientas de depuración e inspección que te ayuden a determinar las causas exactas de un problema. Una vez se ha integrado Edge Inspect dentro del flujo de trabajo, se puede comenzar rápidamente a ver lo mucho que mejora ese flujo de trabajo cuando se prueban aplicaciones basadas en el navegador. Mientras más <strong>dispositivos</strong> necesites probar para tu aplicación web, más tiempo y esfuerzo te evitara <strong>Edge Inspect</strong>.</p>
<figure style="text-align:center">
   <img src="http://activ.com.mx/wp-content/uploads/2013/05/edge_inspect_mnemonic.png" alt="Adobe Edge" width="120" height="117" class="aligncenter size-full wp-image-5675" /></p>
<figcaption>Adobe Edge Inspect</figcaption>
</figure>
<p>Este articulo cubre como configurar Edge Inspect en tu computadora y tus dispositivos y entonces menciona algunas de sus habilidades. Edge Inspect esta disponible con una <strong>suscripción gratuita</strong> a Creative Cloud. Si compras la suscripción completa a Creative Cloud o la suscripción a Edge Inspect, obtendrás la versión completa. La versión gratuita te permite un solo dispositivo conectado, mientras que la versión completa no tiene limite de dispositivos conectados al mismo tiempo.</p>
<p><span id="more-5334"></span></p>
<h2>Configuración</h2>
<p>Una de las partes más impresionantes de Adobe Edge Inspect, para mi, es lo rápido y fácil que se configura. Solo hay <strong>tres pasos</strong> para la instalación:</p>
<ol>
<li>Instala <a href="http://creative.adobe.com/join/starter">Edge Inspect</a> en tu computadora.</li>
<li>Instala la <a href="http://chrome.google.com/webstore/category/extensions">extensión de Chrome</a>.</li>
<li>Instala la aplicación de Edge Inspect en tu dispositivos iOS y/o Android.</li>
</ol>
<p>Una vez se ha instalado todo, sigue estos pasos para comenzar:</p>
<ol>
<li>Asegurate de que la aplicación de Edge Inspect esta abierta en tu computadora.</li>
<li>Abre Edge Inspect en cualquier dispositivo que estés intentando probar (ten en mente que estarás limitado a un dispositivo si es que cuentas con la versión gratuita).</li>
<li> Asumiendo que todos los dispositivos se encuentran en la misma red que tu computadora, deberías ver tu computadora listada debajo de las conexiones de cada dispositivo.</li>
<li>Cuando des clic en tu conexión, se te proporcionara un código de acceso.</li>
<li>Dentro de Chrome en tu computadora, notaras el nuevo <strong>icono de Edge Inspect</strong> (generalmente, esta extensión esta a la derecha de la barra de dirección). Da clic al icono, y escribe el código de acceso a un lado de la lista de dispositivos (Figura 1), para completar el proceso de autorización.</li>
</ol>
<figure style="text-align:center">
   <img src="http://activ.com.mx/wp-content/uploads/2013/05/fig01.jpg" alt="fig01" width="350" height="258" class="aligncenter size-full wp-image-5686" /></p>
<figcaption>Figure 1. Adobe Edge Inspect en Chrome</figcaption>
</figure>
<p><strong>Nota:</strong> Aunque puede ser obvio, si estas conectado a una VPN, puede que encuentres dificultades al detectar con tus dispositivos a la  computadora.</p>
<p> Después del emparejamiento, puedes abrir y cerrar Edge Inspect en tu computadora o dispositivos sin tener que re-ingresar el código de acceso.</p>
<h2>Navegando con Edge Inspect</h2>
<p>Probar tus aplicaciones con Edge Inspect es incluso más fácil que la configuración. Simplemente <strong>navega</strong> usando tu navegador <strong>Chrome</strong>, y todos los dispositivos que hayan sido conectados seguirán esa navegación. Esto permite probar la apariencia y comportamiento de cualquier pagina en una variedad de dispositivos al mismo tiempo. Además, Edge Inspect evitara que tus dispositivos se suspendan, así que no necesitaras desbloquear los dispositivos cuando quieras probar la pagina. No estas limitado a solo navegar dentro de una sola pestaña; Edge Inspect mostrara el contenido dentro de las pestañas actuales al cambiar de pestaña.</p>
<p>Edge Inspect también te permite ver paginas en <strong>modo full screen</strong>, removiendo la aplicación predeterminada de Edge Inspect en Chrome. Para activar esta característica, dentro de la extensión de Chrome, da clic al icono para &quot;show full screen on devices&quot;. Deberías de ver que la barra superior desaparece en todos los dispositivos al navegar a través de Edge Inspect, y da clic al icono de nuevo dentro de la extensión para hacerla aparecer de nuevo.</p>
<p>Por supuesto, navegar paginas en tiempo real es útil, pero muchas de las veces estarás desarrollando localmente. (Para más detalles sobre como usar Edge Inspect con <strong>hosts virtuales</strong>, el Blog del Equipo de Edge inspect tiene muchos posts sobre <a href="http://blogs.adobe.com/edgeinspect/tag/virtual-hosts/">hosts virtuales</a>). Afortunadamente, Edge Inspect soporta completamente la navegación desde tu localhost, permitiéndote probar aplicaciones conforme las vas desarrollando.</p>
<p>No es de extrañar que, Edge Inspect no puede cargar archivos a través de file:/// ya que ese archivo no existe en tus dispositivos. Como puedes esperar, si se esta navegando a través de paginas protegidas por contraseña, tendrás que identificarte en cada dispositivo. Si quieres refrescar la pagina o abrir la pagina dentro del navegador en el dispositivo, simplemente da clic al botón en la parte superior derecha de la ventana de Edge Inspect en el dispositivo. Como un tip, sin embargo, si tu sitio usa autenticación básica de HTTP puedes navegar por la URL usando el formato <strong>http://login:password@my.site.com/</strong> para evitar la re-identificación en cada dispositivo.</p>
<p>Si quieres refrescar la pagina o abrirla dentro del navegador del dispositivo, simplemente da clic al botón en la parte superior derecha de la ventana de Edge Inspect en el dispositivo. Como una alternativa, también puedes dar clic en el icono de la extensión de Chrome para refrescar todos los dispositivos conectados simultáneamente. Refrescar limpiara el cache del dispositivo y solicita los nuevos recursos al servidor.</p>
<h2>Depurando con Edge Inspect</h2>
<p>Una de las mejores características de Edge Inspect es la <strong>depuración</strong>. Cuando das clic al icono de Edge Inspect en Chrome, veras un icono &quot;&lt;&gt;&quot; junto a cada dispositivo conectado. Dando clic a este icono comenzara la sesión de inspección remota y abrirá el panel de depuración. Edge Inspect usa <a href="http://people.apache.org/~pmuellr/weinre/">weinre</a> (<u>we</u>b <u>in</u>spector <u>re</u>mote) para la inspección remota, aunque parecerá familiar para algunos que han usado las herramientas de desarrollo de Chrome o Safari.</p>
<figure style="text-align:center">
  <a href="http://activ.com.mx/wp-content/uploads/2013/05/fig02.jpg"><img src="http://activ.com.mx/wp-content/uploads/2013/05/fig02-300x225.jpg" alt="fig02" width="300" height="225" class="aligncenter size-medium wp-image-5688" /></a></p>
<figcaption>Figure 2. La ventana de debugging</figcaption>
</figure>
<p>Una vez en el panel de depuración, puedes <strong>ver y editar el DOM</strong> y ver estos cambios reflejados en el dispositivo especifico en el que se este depurando la aplicación. Puedes ver los registros de la consola, e incluso muchos elementos que fueron registrados durante el evento onLoad de la pagina. Como probablemente sabes, estas capacidades son muy poderosas cuando se depuran problemas en HTML, CSS y JavaScript.</p>
<p>Actualmente hay unas cuantas limitantes cuando se depura con weinre. La linea de tiempo no devuelve ningún dato, incluso cuando se refresca la pagina, y la pestaña de red solo funciona para XHR. Como puedes esperar, tendrás que disparar los eventos en el dispositivo (esto es, tendrás que dar clic en el botón del dispositivo y no en la computadora) para ver la información enviada a consola. Mientras que puedes editar HTML, CSS y JavaScript, actualmente esto no significa que agregues una nueva linea -no hay opciones Edit As Text o Edit As HTML como en las herramientas de desarrollo de Chrome.</p>
<p>Para aquellos que están familiarizados con los lanzamientos anteriores de Edge Inspect bajo el nombre de Adobe Shadow, pueden estar familiarizados con el hecho de que, por defecto, se basa en los servidores weinre de Adobe. Sin embargo, las versiones recientes te permitirán especificar tu propio servidor weinre al dar clic derecho en la extensión de Chrome y eligiendo &quot;options&quot;. Si estas interesado en como configurar un servidor weinre local para este propósito, el post &quot;<a href="http://jbkflex.wordpress.com/2012/08/28/use-your-own-weinre-server-with-adobe-shadow-step-by-step/">Usa tu propio servidor Weinre con Adobe Shadow</a>&quot; en el blog  RIA Lab de Joseph proporciona una buena guía.</p>
<p>Otra característica muy buena de Edge Inspect es su integración con JS Bin. JS Bin es un sitio muy popular que te permite escribir, modificar y probar tus snippets de HTML, CSS y JavaScript en tiempo real a través del navegador. Edge Inspect permite ver solo la salida de tus script en las pantallas de los dispositivos conectados, permitiéndote editar en tiempo real lo que vez en los dispositivos. Si quieres ver esta característica en acción, revisa el vídeo de demostración de <a href="http://www.youtube.com/watch?v=J8rkap-y41E&amp;feature=relmfu">Remy Sharp</a>.</p>
<h2>Capturas de pantalla con Edge Inspect</h2>
<p>Edge Inspect te permite guardar capturas de pantalla en cualquier dispositivo o todos al mismo tiempo. Para guardar una captura de pantalla a través de los dispositivos, simplemente abre la extensión de Edge Inspect en Chrome y da clic en el botón de la cámara. Esto transferirá las capturas de pantalla desde tus dispositivos a tu computadora. Al dar clic al botón del folder al lado de la cámara, abrirá la carpeta que contiene las capturas de pantalla. Para capturar una sola pantalla de dispositivo, simplemente abre el menú de acción en el dispositivo y da clic a Screenshot. Por ejemplo, la siguiente figura muestra una captura de mi blog ejecutándose en un Samsung Nexus S con Android 4.0 (Ice Cream Sandwich).</p>
<figure style="text-align:center">
  <img src="http://activ.com.mx/wp-content/uploads/2013/01/fig032.jpg" alt="Captura de Pantalla" width="228" height="316" /></p>
<figcaption>Figura 3. Captura de Pantalla</figcaption>
</figure>
<p style="text-align:center">
<p>Como puedes ver, claramente necesito trabajar en esto (aunque mis habilidades de diseño son escasas). Otra cosa interesante a notar: la captura de pantalla es el viewport actual, de modo que si desplazaste o hiciste zoom antes de que se tomara la captura, la imagen contendrá el contenido actual del viewport. Ademas de la imagen, Edge Inspect guarda un archivo de texto con detalles muy útiles como la URL de la pagina, así como el tamaño de la pagina, el sistema operativo, el modelo del dispositivo, las dimensiones de la pantalla, y la densidad de pixeles. Puedes especificar la ubicación donde Edge Inspect coloque las capturas al dar clic derecho en la extencion de Edge Inspect en Chrome y seleccionar &quot;Options&quot;. Yo veo esto muy útil para equipos de prueba que necesitan enviar notas a los desarrolladores explicando la naturaleza de un problema que vieron durante la prueba.</p>
<h2>A donde ir desde aquí</h2>
<p>Si estas construyendo una aplicación web que necesita ser probada en múltiples dispositivos, entonces no hay razón para que no agregues Edge Inspect a tu conjunto de herramientas. Es fácil de configurar, es fácil de usar y trabaja con cualquier IDE o editor, ademas de que ofrece muchas características que probablemente aun no sabes que tiene. Más importante aun, ahorraras tiempo y frustración potencial.</p>
<p>Por favor revisa <a href="http://forums.adobe.com/docs/DOC-2496">este foro</a> para más detalles acerca de problemas conocidos y preguntas hechas frecuentemente acerca de Edge Inspect. Además puedes conseguir información y consejos respecto al uso de Edge Inspect al revisar el <a href="http://blogs.adobe.com/edgeinspect">Blog de Edge Inspect</a>.</p>
<p>En Activ enseñamos el uso de de esta valiosa herramienta y como diseñar y desarrollar sitios como los mencionados en este post en nuestro curso de <a href="http://activ.com.mx/cursos/mobile/html5-para-moviles/">HTML5 para Móviles</a></p>
<p>La versión original de este artículo está publicada en <a href="http://www.adobe.com/devnet/edge-inspect/articles/browser-testing-across-devices-with-adobe-edge-inspect.html" target="_blank">Adobe Devnet</a> bajo licencia Creative Commons, fue traducido y adaptado en nuestro blog por <a href="https://twitter.com/jesus_macedo" target="_blank">Jesús Macedo</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://activ.com.mx/cross-browser-testing-con-adobe-edge-inspect/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Usando Parse.com con PhoneGap</title>
		<link>http://activ.com.mx/usando-parse-com-con-phonegap/</link>
		<comments>http://activ.com.mx/usando-parse-com-con-phonegap/#comments</comments>
		<pubDate>Mon, 18 Feb 2013 20:05:22 +0000</pubDate>
		<dc:creator>jesus_macedo</dc:creator>
				<category><![CDATA[Adobe]]></category>
		<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[Dreamweaver]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[adobe]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[dreamweaver]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[phonegap]]></category>

		<guid isPermaLink="false">http://activ.com.mx/?p=5412</guid>
		<description><![CDATA[La plataforma PhoneGap facilita la transición de la web a aplicaciones nativas (mientras que también brinda acceso a características del dispositivo como la cámara, el micrófono y el acelerómetro), pero aún hay cosas que los desarrolladores deben hacer por sí mismos. Una de las áreas primarias de importancia para una aplicación móvil es el almacenamiento [...]]]></description>
				<content:encoded><![CDATA[<p>La plataforma PhoneGap facilita la transición de la web a aplicaciones nativas (mientras que también brinda acceso a características del dispositivo como la cámara, el micrófono y el acelerómetro), pero aún hay cosas que los desarrolladores deben hacer por sí mismos. Una de las áreas primarias de importancia para una aplicación móvil es el almacenamiento de datos.</p>
<div style="text-align:center"> <img src="http://activ.com.mx/wp-content/uploads/2013/02/iphone_parse.jpg" alt="iphone_parse" width="200" height="220" class="aligncenter size-full wp-image-5471" /></div>
<p><span id="more-5412"></span></p>
<h2>Almacenamiento de datos en aplicaciones móviles</h2>
<p>Cuando construyes aplicaciones que permiten al usuario final el almacenar contenido, debes encontrar una solución para almacenar los datos en una forma persistente. Tienes algunas cuantas opciones:</p>
<ol>
<li>Puedes almacenar todos los datos localmente en el dispositivo. PhoneGap proporciona acceso a una base de datos del lado del cliente a través de su <a href="http://docs.phonegap.com/en/2.2.0/cordova_storage_storage.md.html#Storage" target="_blank">API de Base de Datos</a>. Funciona bien, especialmente con desarrolladores que hay trabajado con bases de datos de SQL. Pero los datos están confinados en el dispositivo. Si el usuario instala la aplicación en otro dispositivo (como en una tableta), entonces el usuario no podrá acceder a los mismos datos.</li>
<li>Puedes almacenar los datos en un servidor remoto. Es fácil configurar AJAX para conectarse a un servidor remoto para enviar o recibir datos. Pero esto requiere la configuración de un servidor, instalar algún tipo de intermediario (ColdFusion, PHP, Node, u otros) y configurar un API en el servidor para manejar la identificación de los usuarios, la creación de datos, consultas, y más. Si eliges esta opción, serás responsable del mantenimiento del servidor. Puedes salir a caminar, adoptar a un perro o regar tus plantas mientras estás en ello.</li>
<li>Puedes descargar el mantenimiento del servidor, la creación del API, los requerimientos de almacenamiento, y delegar esencialmente todas esas tareas al almacenar datos con una solución de terceros. Todo esto está disponible si usas la plataforma de aplicaciones móviles Parse.</li>
</ol>
<p>Parse permite que los usuarios almacenen datos en sus servidores. Los datos pueden ser de cualquier tipo. ¿Quieres construir una plataforma para un blog? Puedes almacenar las entradas del blog. ¿Quieres construir un foro? Puedes almacenar los posts de los foros. ¿Quieres diseñar una red de compras especializada en las necesidades de los Zombis? Parse lo hace fácil.</p>
<p>La compra de Parse está estructurada en <a href="https://parse.com/plans" target="_blank">tres planes</a>. El plan más básico, es 100% gratuito y proporciona capacidades importantes como parte de este servicio gratuito. Como desarrollador te puedes registrar gratis. Si evalúas Parse y decides que no es para ti, Parse incluye la posibilidad de exportar tus datos. No estas forzado a usar Parse, puedes usar una estrategia diferente. Parse es un asunto casual que rápidamente crece en el amor de muchos desarrolladores.</p>
<p>Parse ofrece muchas formas de usar su servicio. Puedes usar un conjunto de APIs que están escritas como librerías nativas. Mientras que los desarrolladores de PhoneGap comúnmente evitan trabajar con el lenguaje nativo de cada plataforma, aquellos que desean crear sus aplicaciones usando tecnologías nativas pueden tomar ventaja de los SDKs completamente especializados para su plataforma de desarrollo. (Por el momento hay SDKs disponibles para Android, iOS y Windows).</p>
<p>Además puedes usar un API sencilla basada en REST. Mientras que puedes usar esta plataforma desde PhoneGap, comúnmente se usa para el desarrollo del lado del servidor. Uno de los beneficios de Parse es la posibilidad de omitir por completo el trabajo con un servidor, aunque aún puedes usar un servidor web tradicional. Con el API de REST, tu servidor puede comunicarse con Parse para buscar y trabajar con datos.</p>
<p>Y finalmente, puedes usar el API de JavaScript. Esto permite a los desarrolladores de JavaScript el hacer uso completo del API de Parse desde PhoneGap o aplicaciones web. En la siguiente sección, aprenderás como usar el API de JavaScript y veras como agregar Parse a tu aplicación.</p>
<h2>Trabajando con Parse</h2>
<p>Para comenzar, regístrate en el sitio web de Parse.</p>
<ol>
<li>Visita <a href="https://parse.com/" target="_blank">parse.com</a> y crea una cuenta gratuita.</li>
</ol>
<p>Después de haberte registrado, Parse mostrara el formulario de inicio para construir una nueva aplicación:</p>
<p style="text-align:center"><img src="http://activ.com.mx/wp-content/uploads/2013/01/fig016.jpg" alt="Registro de Aplicación" width="284" height="256" /></p>
<p>Ingresa el nombre de tu elección. Para los propósitos de este artículo, el nombre de la aplicación será ADCApp.</p>
<p>Después de haber completado el proceso de registro, aparecerá una página de bienvenida.</p>
<ol start="2">
<li>Da clic al enlace Dashboard (en el menú superior de la página de bienvenida).</li>
</ol>
<p>Este dashboard proporciona muchas características. Por ahora, nos enfocaremos en las características relacionadas a la búsqueda de datos y configuración.</p>
<ol start="3">
<li>Revisa las opciones en la pestaña Information del lado izquierdo:</li>
</ol>
<p style="text-align:center"><img src="http://activ.com.mx/wp-content/uploads/2013/01/fig024.jpg" alt="Pestaña Information" width="180" height="354" /></p>
<p>Esta pestaña contiene varias claves para la integración con el API de JavaScript. Para este ejemplo, solo necesitaras el ID de la Aplicación y la clave de JavaScript. Después, cuando se edite el código, se copiaran estos valores.</p>
<ol start="4">
<li>Da clic al enlace de Descargas en la parte superior de la página.</li>
</ol>
<p>La sección de JavaScript incluye muchos enlaces, incluyendo una versión minified del SDK.</p>
<ol start="5">
<li>Descarga el SDK y colócalo en una nueva carpeta.</li>
<li>Descarga los archivos de ejemplo proporcionados <a href="http://download.stage.macromedia.com/pub/developer/phonegap/parse-phonegap.zip" target="_blank">aquí</a> para obtener el código de esta aplicación y colocar los archivos en esta nueva carpeta.</li>
</ol>
<p>Antes de ir más allá, deberíamos decidir lo que queremos construir. Parse nos permite almacenar datos de cualquier tipo. Para mantener las cosas sencillas en nuestra aplicación de ejemplo, diseñaremos una aplicación de notas. La aplicación te permite escribir nuevas notas así como ver las notas previamente creadas.</p>
<h2>Creando una aplicación de notas</h2>
<p>Para hacer las cosas lo más sencillas como sea posible, la aplicación no usara ningún framework de interfaz de usuario en particular. Esta no es la forma más elegante de desarrollar la aplicación, pero su objetivo principal es ilustrar como trabajar con el API de Parse.</p>
<ol>
<li>Ejecuta el editor de HTML de tu elección, y crea un archivo HTML en la tura principal del sitio del proyecto.</li>
<li>Copia el código de abajo, pégalo en el archivo HTML y guárdalo.</li>
</ol>
<pre>
&lt;!doctype html&gt;<br />
&lt;html lang=&quot;en&quot;&gt;<br />
&lt;head&gt;<br />
&lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;<br />
&lt;script type=&quot;text/javascript&quot; src=&quot;jquery.min.js&quot;&gt;&lt;/script&gt;<br />
&lt;script src=&quot;parse.min.js&quot;&gt;&lt;/script&gt;<br />
&lt;script src=&quot;main.js&quot;&gt;&lt;/script&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
	&lt;h2&gt;Note Application&lt;/h2&gt;<br />
	&lt;div id=&quot;notes&quot;&gt;&lt;/div&gt;<br />
	&lt;form id=&quot;addNote&quot;&gt;<br />
		&lt;p&gt;&lt;input type=&quot;text&quot; id=&quot;noteTitle&quot; placeHolder=&quot;Note Title&quot;&gt;&lt;/p&gt;<br />
		&lt;p&gt;&lt;textarea id=&quot;noteBody&quot; placeHolder=&quot;Enter note text here.&quot;&gt;&lt;/textarea&gt;&lt;/p&gt;<br />
		&lt;p&gt;&lt;input type=&quot;submit&quot; id=&quot;addNoteBtn&quot; value=&quot;Add Note&quot;&gt;&lt;/p&gt;<br />
	&lt;/form&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;
</pre>
<p><strong>Nota:</strong> El código de arriba hace referencia a parse.min.js. La copia del archivo que debes de haber descargado desde Parse.com incluye su versión, por ejemplo: parse-1.1.12.min.js. Puedes renombrar el archivo o solo editar el código de ejemplo para que sea el mismo nombre que el de tu archivo.</p>
<p>Esta aplicación carga jQuery, el SDK de Parse, y un archivo llamado main.js. El HTML consiste en una etiqueta DIV vacía y un formulario. La etiqueta DIV vacía contiene el contenido para cargar desde Parse, el cual vendrá al usuario después de publicar algo texto de contenido. El formulario en la aplicación permitirá que los usuarios ingresen nuevo contenido. En este caso, el formulario contiene dos campos para ingresar el título de la nota y el cuerpo de texto de la nota. Recuerda, Parse permite guardar cualquier cosa. Si tu concepto de notas incluye un campo relacionado al nivel de felicidad de la nota -solo agrégalo.</p>
<ol start="3">
<li>Toma un momento para revisar main.js, el cual contiene mucha de la lógica de la aplicación.</li>
</ol>
<pre>
//Parse related keys
var PARSE_APP = "[Parse.com Application ID]";
var PARSE_JS = "[Parse.com JavaScript Key]";

$(document).ready(function() {
	Parse.initialize(PARSE_APP, PARSE_JS);

	NoteObject = Parse.Object.extend("NoteObject");

	$("#addNoteBtn").on("touchend", function(e) {
		e.preventDefault();
		
		//Grab the note details, no real validation for now
		var title = $("#noteTitle").val();
		var body = $("#noteBody").val();

		var note = new NoteObject();
		note.save({title:title, body:body}, {
			success:function(object) {
				console.log("Saved the object!");
			}, 
			error:function(object,error) {
				console.dir(error);
				alert("Sorry, I couldn't save it.");
			}
		});
	});
});
</pre>
<ol start="4">
<li>Edita el código, reemplazando las variables PARSE_APP y PARSE_JS con el ID de la aplicación y la clave de JavaScript desde el dashboard de Parse.</li>
</ol>
<p>Puedes usar la función de jQuery document.ready() para ejecutar código cuando se haya terminado de cargar la página. Antes de que podamos usar Parse, primero debemos inicializarla. Es un simple llamado que hace uso de las variables creadas con anterioridad.</p>
<p>La siguiente línea es importante:</p>
<pre>NoteObject = Parse.Object.extend(&quot;NoteObject&quot;);</pre>
<p>Cuando decides el tipo de dato que quieres crear, debes nombrarlo. En el código proporcionado, se llama <em>NoteObject</em>. Una vez se llama al objeto <em>Parse</em>, puedes pedirle al SDK de Parse que cree un tipo de objeto para extender la clase <em>Object</em>. El resultado es NoteObject que actúa como una clase nueva.</p>
<p>Así como leas el código, veras la lógica sencilla vinculada al formulario. Cuando se presione el botón, el código capturara el texto contenido en los campos del formulario.</p>
<p><strong>Nota:</strong> Para probar los eventos táctiles en un navegador de escritorio, se puede cambiar temporalmente el código a clic, o usar las Herramientas de Desarrollo de Chrome para habilitar la simulación táctil. Para usar estas herramientas, actualiza las opciones al dar clic al icono de configuración en la esquina inferior derecha de la caja de dialogo de las herramientas de desarrollo, y entonces selecciona la pestaña <em>Overrides</em>. Desplaza hacia abajo la página y habilita la opción <em>Emulate Touch Events</em>.</p>
<p>A continuación, se hará una nueva instancia de NoteObject y se ejecutara el método <em>save</em> en esta. El primer argumento del método save son los datos. En este ejemplo, hay una clave llamada title y una clave llamada body. Estas dos claves representan los campos de entrada del NoteObject. Sin embargo, puedes usar los nombres que prefieras, debido a que Parse es flexible. Cuando sea necesario, incluso puedes cambiar los nombres de las claves en otro momento (aunque las mejores prácticas sugieren mantener consistentes los nombres).</p>
<p>El siguiente argumento es un objeto genérico de JavaScript que contiene las claves <em>success</em> y <em>error</em>. Ambas son funciones que representan la lógica que es llamada basada en el resultado de la operación save. En caso de error, se mostrara una alerta. Cuando el contenido de la nota se ha guardado correctamente, el código mostrara un mensaje de éxito directamente en la consola de JavaScript. Después podrás mejorar estos comportamientos.</p>
<h2>Probando la aplicación</h2>
<p>Después de haber editado la aplicación de ejemplo, es hora de probarla.</p>
<ul>
<li>Abre el archivo HTML en tu navegador. Ingresa algún texto a los campos y da clic a Save.</li>
</ul>
<p>Si la consola de JavaScript está abierta en tu navegador, podrás ver el resultado.</p>
<ul>
<li>Para confirmar que el contenido se guardó correctamente en el framework Parse, visita el dashboard de Parse, da clic a la pestaña <em>Data Browser</em>, y veras el texto guardado.</li>
</ul>
<p style="text-align:center"><img src="http://activ.com.mx/wp-content/uploads/2013/01/fig033.jpg" alt="Dashboard" width="380" height="99" /></p>
<p>Nota que la lista incluye propiedades adicionales que fueron almacenados con los datos. Parse captura información útil relacionada con los campos, como <em>createdAt </em>y <em>updatedAt</em>. Además nota que ha sido asignado un <em>objectId</em> a los datos almacenados.</p>
<p>Tu aplicación HTML solo crea contenido y lo almacena, gratis y sin un servidor (bueno, sin requerir la configuración de un servidor).</p>
<h2>Visualizando los datos almacenados en Parse</h2>
<p>A continuación, veras como listar objetos. Revisa la siguiente versión actualizada de main.js que lista el contenido almacenado cuando se carga la aplicación.</p>
<pre>
//Parse related keys
var PARSE_APP = "[Parse.com Application ID]";
var PARSE_JS = "[Parse.com JavaScript Key]";

$(document).ready(function() {
	Parse.initialize(PARSE_APP, PARSE_JS);

	NoteObject = Parse.Object.extend("NoteObject");

	function getNotes() {
		var query = new Parse.Query(NoteObject);

		query.find({
			success:function(results) {
				console.dir(results);
				var s = "";
				for(var i=0, len=results.length; i&lt;len; i++) {
					var note = results[i];
					s += &quot;<p>";
					s += "<b>"+note.get("title")+"</b><br />";
					s += "<b>Written "+note.createdAt + "</b><br />";
					s += note.get("body");
					s += "</p>";
				}
				$("#notes").html(s);
			},
			error:function(error) {
				alert("Error when getting notes!");
			}
		});
	}

	$("#addNoteBtn").on("touchend", function(e) {
		e.preventDefault();

		//Grab the note details, no real validation for now
		var title = $("#noteTitle").val();
		var body = $("#noteBody").val();

		var note = new NoteObject();
		note.save({title:title, body:body}, {
			success:function(object) {
				console.log("Saved the object!");
				$("#noteTitle").val("");
				$("#noteBody").val("");
				getNotes();
			}, 
			error:function(object,error) {
				console.dir(error);
				alert("Sorry, I couldn't save it.");
			}
		});
	});

	//call getNotes immediately
	getNotes();

});
</pre>
<p>En esta sección, nos enfocaremos en actualizar el archivo de la aplicación.</p>
<ul>
<li>Revisa la función <em>getNotes</em> que inicia creando una instancia del objeto <em>Parse.Query</em>.</li>
</ul>
<pre>
function getNotes() {
	var query = new Parse.Query(NoteObject);

	query.find({
		success:function(results) {
			console.dir(results);
			var s = "";
			for(var i=0, len=results.length; i&lt;len; i++) {
				var note = results[i];
				s += &quot;<p>";
				s += "<b>"+note.get("title")+"</b><br />";
				s += "<b>Written "+note.createdAt + "</b><br />";
				s += note.get("body");
				s += "</p>";
			}
			$("#notes").html(s);
		},
		error:function(error) {
			alert("Error when getting notes!");
		}
	});
}
</pre>
<p>El código anterior ilustra cómo puedes consultar datos desde Parse. La clase NoteObject es enviada, así que la consulta funciona solo con esa clase en particular. Cuando se ejecuta el método <em>find</em>, los resultados están en un arreglo. (En el ejemplo de arriba, esta es la propiedad createdAt). Aquí hay un ejemplo de cómo se muestran los datos en Chrome:</p>
<p style="text-align:center"><img src="http://activ.com.mx/wp-content/uploads/2013/01/fig043.jpg" alt="Datos en Chrome" width="320" height="274" /></p>
<p>El manejador para agregar notas también esta actualizado para limpiar al formulario y llamar de nuevo a la función getNotes. Ese no es el enfoque más elegante, pero funciona. Parse tiene un API de consulta increíblemente poderoso que permite muchas formas de filtrar las opciones. Si quieres hacer que esta aplicación funcione mejor, puedes modificar el código para obtener resultados de objetos creados después del timestamp, basado en el momento en que fue enviado el formulario.</p>
<h3>Recomendaciones para extender la aplicación</h3>
<p>Este articulo solo rosa la superficie de lo que se puede hacer utilizando Parse. Para obtener más información lee la <a href="https://parse.com/docs/js_guide" target="_blank">Guía de JavaScript</a>. Algunas características interesantes son:</p>
<ul>
<li>Manejo de usuarios: Esto incluye la lógica de almacenamiento de usuarios que de otra forma es difícil de configurar. Por ejemplo, puedes asegurarte de que las direcciones de correo no se dupliquen, manejar el reinicio de contraseñas, y cachar las credenciales de identificación para la funcionalidad de login automático.</li>
<li>Seguridad completa: En este proyecto de ejemplo, todos los objetos son retornados al dispositivo móvil. Pero en el mundo real de las aplicaciones, las notas estarían asociadas con sus creadores. Parse tiene un modelo de usuarios robusto, con soporte para asociar los objetos a los usuarios. Además puedes crear grupos y conjuntos de permisos para los objetos.</li>
<li>Integración con Twitter y Facebook: Nunca he escuchado de otro sitio, pero si en tu caso lo has hecho, Parse te ayuda a la integración con estos.</li>
<li>Geolocalización: Mientras que Parse no agrega soporte directo para geolocalización, incluye una forma especial de manejar objetos que tienen datos de GPS. Así que si tu aplicación accede a la ubicación del usuario, puedes simplemente almacenar esos datos con un objeto. Puedes usar el API de consulta para ver los datos cercanos a la ubicación.</li>
</ul>
<h2>A dónde ir desde aquí</h2>
<p>En este artículo, aprendiste como usar Parse para almacenar datos de aplicaciones móviles. Puedes estar pensando en cómo encaja PhoneGap en este flujo de trabajo. PhoneGap ofrece la oportunidad de aprovechar librerías de JavaScript y APIs para llevarlas a los dispositivos móviles. Toda la información proporcionada acerca de Parse trabaja bien con PhoneGap. Puedes usar el código de este artículo, cargarlo a PhoneGap Build, y crear una aplicación móvil en un tiempo de casi un minuto.</p>
<p>La versión original de este artículo está publicada en <strong><a href="http://www.adobe.com/devnet/phonegap/articles/using-parse-with-phonegap-a-marriage-made-in-awesome.html">Adobe Devnet</a></strong> bajo licencia Creative Commons, fue traducido y adaptado en nuestro blog por <strong><a href="https://twitter.com/jesus_macedo">Jesús Macedo</a></strong>.</p>
]]></content:encoded>
			<wfw:commentRss>http://activ.com.mx/usando-parse-com-con-phonegap/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Fundamentos de OOP en JavaScript</title>
		<link>http://activ.com.mx/fundamentos-de-oop-en-javascript/</link>
		<comments>http://activ.com.mx/fundamentos-de-oop-en-javascript/#comments</comments>
		<pubDate>Thu, 13 Dec 2012 19:24:36 +0000</pubDate>
		<dc:creator>jesus_macedo</dc:creator>
				<category><![CDATA[Articulos]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[articulos]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[tutoriales]]></category>

		<guid isPermaLink="false">http://activ.com.mx/?p=5144</guid>
		<description><![CDATA[En este artículo, se discutirá la creación de objetos en JavaScript utilizando la herencia de prototipos como una alternativa al operador new. Un aspecto importante de JavaScript es que raramente hay una sola forma correcta de realizar cualquier tarea. JavaScript es un lenguaje libremente escrito, dinámico y expresivo, lo cual significa que usualmente hay muchas [...]]]></description>
				<content:encoded><![CDATA[<p>En este artículo, se discutirá la creación de objetos en JavaScript utilizando la herencia de prototipos como una alternativa al operador <strong>new.</strong></p>
<p>Un aspecto importante de JavaScript es que raramente hay una sola forma correcta de realizar cualquier tarea. JavaScript es un lenguaje libremente escrito, dinámico y expresivo, lo cual significa que usualmente hay muchas formas de ejecutar la misma tarea. No estoy diciendo que los métodos descritos aquí para crear objetos son la forma correcta de hacerlo o incluso la mejor manera, pero yo siento que están muy cerca de la verdadera naturaleza del lenguaje y te ayudaran a comprender que está pasando bajo las capas si eliges utilizar otros métodos.</p>
<p style="text-align:center"><img src="http://activ.com.mx/wp-content/uploads/2012/12/edge_code.jpg" alt="JavaScript" width="380" height="209" class="aligncenter size-full wp-image-5206" /></p>
<p>Para ayudarte a comprender mejor estos conceptos, este artículo describe la creación del sistema de partículas básica con procesamiento de múltiples objetivos. Esta es una tarea bastante compleja para representar en una prueba del mundo real de los conceptos que demostraré, en lugar de un sencillo Hello World.</p>
<p><span id="more-5144"></span></p>
<h2>Conceptos básicos de la creación de un objeto</h2>
<p>El objetivo de este artículo es la creación de objetos JavaScript. Muchos tutoriales te dirán que crees una función constructora, agregues métodos a la propiedad prototype de la función, y entonces uses el operador new de esta forma:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"> <span style="color: #000066; font-weight: bold;">function</span> Foo<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">name</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;foo&quot;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
  Foo.<span style="color: #000066; font-weight: bold;">prototype</span>.<span style="color: #660066;">sayHello</span> <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  alert<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;hello from &quot;</span> <span style="color: #339933;">+</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">name</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
  <span style="color: #000066; font-weight: bold;">var</span> myFoo <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">new</span> Foo<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  myFoo.<span style="color: #660066;">sayHello</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>El objeto recientemente creado ahora tiene todas las propiedades que fueron definidas en la función constructora del prototipo. Esto crea algo que luce mucho más a una clase basada en lenguaje. Para hacer nuevas &ldquo;subclases&rdquo; que heredan esa &ldquo;clase&rdquo;, deberías establecer la propiedad prototype de las &ldquo;subclases&rdquo; a una nueva instancia de la &ldquo;clase&rdquo; original. (estoy usando comillas debido a que las entidades no son clases o subclases reales).</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #000066; font-weight: bold;">function</span> Bar<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #009900;">&#125;</span>
  Bar.<span style="color: #000066; font-weight: bold;">prototype</span> <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">new</span> Foo<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
  Bar.<span style="color: #000066; font-weight: bold;">prototype</span>.<span style="color: #660066;">sayGoodbye</span> <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  alert<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;goodbye from &quot;</span> <span style="color: #339933;">+</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">name</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
  <span style="color: #000066; font-weight: bold;">var</span> myBar <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">new</span> Bar<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  myBar.<span style="color: #660066;">sayHello</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  myBar.<span style="color: #660066;">sayGoodbye</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>El problema es que debido a que esta estructura luce similar a las clases reales en otros lenguajes, la gente espera que se comporten exactamente como las clases reales se comportan en otros lenguajes. Pero mientras más trabajes con estos tipos de &ldquo;clases&rdquo; verás más que no se comportan de esa forma. Así que la gente se molesta con JavaScript, y comienza a pensar que es un mal lenguaje que no puede ser utilizado para algo serio. Otros intentarán arreglar estas estructuras parecidas a las clases, al construir frameworks muy complejos para obtener funciones constructoras y prototipos que luzcan y se comporten más como las clases.</p>
<p>Personalmente, veo esto como un esfuerzo equivocado. No es necesariamente incorrecto, pero la energía que será gastada probablemente produciría mejores resultados si fuera en otra dirección.</p>
<h3>Alcanzando la herencia de prototipos</h3>
<p>JavaScript no es un lenguaje basado en clases, pero es uno basado en prototipos. El reusó de código no es hecho al crear plantillas de clases que son utilizadas para instanciar objetos, es hecho al crear nuevos objetos directamente, y entonces crear otros objetos basados en estos ya existentes. El objeto existente es asignado como el prototipo del nuevo objeto y entonces se le puede agregar nuevo comportamiento al nuevo objeto. Es un sistema muy elegante y está muy bien implementado en <a href="http://www.adobe.com/Users/brinaldi/Documents/Tech%20Review/Keith%20Peters%20-%20JavaScript%20Objects/iolanguage.com">lenguaje io</a>, el cual te invito a revisar.</p>
<p>Antes de ir más lejos, quiero aclarar el término prototipo. Primero, está la propiedad prototype de una función constructora como se mostró en la última sección de ejemplo. Hay otra propiedad oculta que es el prototipo real de un objeto. Esto puede ser muy confuso. La propuesta de ECMAScript se refiere a esta propiedad oculta como [[Prototype]]. Esto es expuesto en algunos entornos de JavaScript como la propiedad __proto__, pero esta no es una parte estándar del lenguaje y no debería ser contada como tal. Cuando creas un nuevo objeto utilizando new con una función constructora, se establece el [[Prototype]] de ese nuevo objeto con una referencia al prototipo de la función constructora.</p>
<p>Además de esta confusión de nombramiento, en el lenguaje se tuvieron que tomar dos decisiones de diseño que agregan confusión desde entonces. Primero, debido a la preocupación de que algunos desarrolladores no están conformes con la herencia de prototipos, se introdujeron las funciones constructoras y el operador new. Segundo, no había forma nativa directa para crear un nuevo objeto con otro objeto como su [[Prototype]], excepto a través del nuevo operador new con una función constructora.</p>
<p>Afortunadamente, muchos navegadores soportan el método Object.create. Este método toma un objeto existente como parámetro. Retorna un nuevo objeto que tiene asignado al objeto existente como su [[Prototype]]. Aún más, este método es muy fácil de crear para aquellos entornos que no lo soportan.</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">typeof</span> <span style="">Object</span>.<span style="color: #660066;">create</span> <span style="color: #339933;">!==</span> <span style="color: #3366CC;">&quot;function&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="">Object</span>.<span style="color: #660066;">create</span> <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span>o<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #000066; font-weight: bold;">function</span> F<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span>
  F.<span style="color: #000066; font-weight: bold;">prototype</span> <span style="color: #339933;">=</span> o<span style="color: #339933;">;</span>
  <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">new</span> F<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Entonces, ¿cómo rescribirías el ejemplo anterior usando Object.create? Primero crea un objeto foo que tiene una propiedad name y una función sayHello.</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #000066; font-weight: bold;">var</span> foo <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span>
  name<span style="color: #339933;">:</span> <span style="color: #3366CC;">&quot;foo&quot;</span><span style="color: #339933;">,</span>
  sayHello<span style="color: #339933;">:</span> <span style="color: #000066; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  alert<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;hello from &quot;</span> <span style="color: #339933;">+</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">name</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
  <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
  foo.<span style="color: #660066;">sayHello</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Entonces, se usa Object.create para hacer un objeto bar que tiene a foo como su prototipo, y se le agrega una función sayGoodBye:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #000066; font-weight: bold;">var</span> bar <span style="color: #339933;">=</span> <span style="">Object</span>.<span style="color: #660066;">create</span><span style="color: #009900;">&#40;</span>foo<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  bar.<span style="color: #660066;">sayGoodbye</span> <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  alert<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;goodbye from &quot;</span> <span style="color: #339933;">+</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">name</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
  bar.<span style="color: #660066;">sayHello</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  bar.<span style="color: #660066;">sayGoodbye</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>También es muy común el crear y extender una función que simplifica el agregar métodos y propiedades al objeto nuevo. El siguiente método simplemente copia cualquier propiedad desde props a obj:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #000066; font-weight: bold;">function</span> extend<span style="color: #009900;">&#40;</span>obj<span style="color: #339933;">,</span> props<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #000066; font-weight: bold;">for</span><span style="color: #009900;">&#40;</span>prop <span style="color: #000066; font-weight: bold;">in</span> props<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>props.<span style="color: #000066;">hasOwnProperty</span><span style="color: #009900;">&#40;</span>prop<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  obj<span style="color: #009900;">&#91;</span>prop<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> props<span style="color: #009900;">&#91;</span>prop<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
  <span style="color: #009900;">&#125;</span>
  <span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Esto te permite crear bar de esta forma:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #000066; font-weight: bold;">var</span> bar <span style="color: #339933;">=</span> <span style="">Object</span>.<span style="color: #660066;">create</span><span style="color: #009900;">&#40;</span>foo<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  extend<span style="color: #009900;">&#40;</span>bar<span style="color: #339933;">,</span> <span style="color: #009900;">&#123;</span>
  sayGoodbye<span style="color: #339933;">:</span> <span style="color: #000066; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  alert<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;goodbye from &quot;</span> <span style="color: #339933;">+</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">name</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
  <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>No hay gran cosa aquí, pero simplifica las cosas grandemente cuando se están agregando muchas más propiedades o métodos.</p>
<p>Muy bien, ahora que ya revisamos los fundamentos, podemos comenzar a ponerlos juntos en un escenario del mundo real.</p>
<h2>Creando partículas usando Object.create</h2>
<p>Las partículas utilizadas en el proyecto de ejemplo serán muy básicos: puntos negros que se mueven alrededor en un espacio bidimensional y rebotan en las paredes. Estos además soportan gravedad y fricción según sea necesario. Se definirá un objeto particular que tiene todas las propiedades y métodos necesarios, y se colocara en un objeto adc para evitar contaminar el namespace global. Para más información de namespaces, revisa el artículo de Wikipedia sobre JavaScript discreto. </p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #000066; font-weight: bold;">var</span> adc <span style="color: #339933;">=</span> adc <span style="color: #339933;">||</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
  adc.<span style="color: #660066;">particle</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span>
  x<span style="color: #339933;">:</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">,</span>
  y<span style="color: #339933;">:</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">,</span>
  vx<span style="color: #339933;">:</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">,</span>
  vy<span style="color: #339933;">:</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">,</span>
  gravity<span style="color: #339933;">:</span> <span style="color: #CC0000;">0.0</span><span style="color: #339933;">,</span>
  bounce<span style="color: #339933;">:</span> <span style="color: #339933;">-</span><span style="color: #CC0000;">0.9</span><span style="color: #339933;">,</span>
  friction<span style="color: #339933;">:</span> <span style="color: #CC0000;">1.0</span><span style="color: #339933;">,</span>
  bounds<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">,</span>
  color<span style="color: #339933;">:</span> <span style="color: #3366CC;">&quot;#000000&quot;</span><span style="color: #339933;">,</span>
  context<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">,</span>
&nbsp;
  update<span style="color: #339933;">:</span> <span style="color: #000066; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">vy</span> <span style="color: #339933;">+=</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">gravity</span><span style="color: #339933;">;</span>
  <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">x</span> <span style="color: #339933;">+=</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">vx</span><span style="color: #339933;">;</span>
  <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">y</span> <span style="color: #339933;">+=</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">vy</span><span style="color: #339933;">;</span>
  <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">vx</span> <span style="color: #339933;">*=</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">friction</span><span style="color: #339933;">;</span>
  <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">vy</span> <span style="color: #339933;">*=</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">friction</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">x</span> <span style="color: #339933;">&lt;</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">bounds</span>.<span style="color: #660066;">x1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">x</span> <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">bounds</span>.<span style="color: #660066;">x1</span><span style="color: #339933;">;</span>
  <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">vx</span> <span style="color: #339933;">*=</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">bounce</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
  <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">x</span> <span style="color: #339933;">&gt;</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">bounds</span>.<span style="color: #660066;">x2</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">x</span> <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">bounds</span>.<span style="color: #660066;">x2</span><span style="color: #339933;">;</span>
  <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">vx</span> <span style="color: #339933;">*=</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">bounce</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
  <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">y</span> <span style="color: #339933;">&lt;</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">bounds</span>.<span style="color: #660066;">y1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">y</span> <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">bounds</span>.<span style="color: #660066;">y1</span><span style="color: #339933;">;</span>
  <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">vy</span> <span style="color: #339933;">*=</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">bounce</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
  <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">y</span> <span style="color: #339933;">&gt;</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">bounds</span>.<span style="color: #660066;">y2</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">y</span> <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">bounds</span>.<span style="color: #660066;">y2</span><span style="color: #339933;">;</span>
  <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">vy</span> <span style="color: #339933;">*=</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">bounce</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
  <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
&nbsp;
  render<span style="color: #339933;">:</span> <span style="color: #000066; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">context</span> <span style="color: #339933;">===</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #000066; font-weight: bold;">throw</span> <span style="color: #000066; font-weight: bold;">new</span> Error<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;context needs to be set on particle&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
  <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">context</span>.<span style="color: #660066;">fillStyle</span> <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">color</span><span style="color: #339933;">;</span>
  <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">context</span>.<span style="color: #660066;">fillRect</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">x</span> <span style="color: #339933;">-</span> <span style="color: #CC0000;">1.5</span><span style="color: #339933;">,</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">y</span> <span style="color: #339933;">-</span> <span style="color: #CC0000;">1.5</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">3</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">3</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
  <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Después, se necesitará un sistema de partículas para realizar el seguimiento de todas las partículas y controlar su actualización y procesamiento.</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #000066; font-weight: bold;">var</span> adc <span style="color: #339933;">=</span> adc <span style="color: #339933;">||</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
  adc.<span style="color: #660066;">particleSystem</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span>
  particles<span style="color: #339933;">:</span> <span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
&nbsp;
  addParticle<span style="color: #339933;">:</span> <span style="color: #000066; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>particle<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">particles</span>.<span style="color: #660066;">push</span><span style="color: #009900;">&#40;</span>particle<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
&nbsp;
  update<span style="color: #339933;">:</span> <span style="color: #000066; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #000066; font-weight: bold;">var</span> i<span style="color: #339933;">,</span>
  numParticles <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">particles</span>.<span style="color: #660066;">length</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #000066; font-weight: bold;">for</span><span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> numParticles<span style="color: #339933;">;</span> i <span style="color: #339933;">+=</span> <span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">particles</span><span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #660066;">update</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
  <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
&nbsp;
  render<span style="color: #339933;">:</span> <span style="color: #000066; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #000066; font-weight: bold;">var</span> i<span style="color: #339933;">,</span>
  numParticles <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">particles</span>.<span style="color: #660066;">length</span><span style="color: #339933;">;</span>
  <span style="color: #000066; font-weight: bold;">for</span><span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> numParticles<span style="color: #339933;">;</span> i <span style="color: #339933;">+=</span> <span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">particles</span><span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #660066;">render</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
  <span style="color: #009900;">&#125;</span>
  <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Y finalmente, se necesitará un archivo principal que cree el sistema, cree y agregue todas las partículas, y configure el bucle de animación.</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">typeof</span> <span style="">Object</span>.<span style="color: #660066;">create</span> <span style="color: #339933;">!==</span> <span style="color: #3366CC;">&quot;function&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="">Object</span>.<span style="color: #660066;">create</span> <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span>o<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #000066; font-weight: bold;">function</span> F<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span>
  F.<span style="color: #000066; font-weight: bold;">prototype</span> <span style="color: #339933;">=</span> o<span style="color: #339933;">;</span>
  <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">new</span> F<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #000066; font-weight: bold;">var</span> system<span style="color: #339933;">,</span>
  numParticles<span style="color: #339933;">,</span>
  canvas<span style="color: #339933;">,</span>
  context<span style="color: #339933;">,</span>
  bounds<span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #000066; font-weight: bold;">function</span> initSystem<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  system <span style="color: #339933;">=</span> <span style="">Object</span>.<span style="color: #660066;">create</span><span style="color: #009900;">&#40;</span>adc.<span style="color: #660066;">particleSystem</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  numParticles <span style="color: #339933;">=</span> <span style="color: #CC0000;">200</span><span style="color: #339933;">;</span>
  canvas <span style="color: #339933;">=</span> document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;canvas&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  context <span style="color: #339933;">=</span> canvas.<span style="color: #660066;">getContext</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;2d&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  canvas.<span style="color: #660066;">width</span> <span style="color: #339933;">=</span> window.<span style="color: #660066;">innerWidth</span><span style="color: #339933;">;</span>
  canvas.<span style="color: #660066;">height</span> <span style="color: #339933;">=</span> window.<span style="color: #660066;">innerHeight</span><span style="color: #339933;">;</span>
  bounds <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span>
  x1<span style="color: #339933;">:</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">,</span>
  y1<span style="color: #339933;">:</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">,</span>
  x2<span style="color: #339933;">:</span> canvas.<span style="color: #660066;">width</span><span style="color: #339933;">,</span>
  y2<span style="color: #339933;">:</span> canvas.<span style="color: #660066;">height</span>
  <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #000066; font-weight: bold;">function</span> initParticles<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #000066; font-weight: bold;">var</span> i<span style="color: #339933;">,</span> particle<span style="color: #339933;">;</span>
  <span style="color: #000066; font-weight: bold;">for</span><span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> numParticles<span style="color: #339933;">;</span> i <span style="color: #339933;">+=</span> <span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  particle <span style="color: #339933;">=</span> <span style="">Object</span>.<span style="color: #660066;">create</span><span style="color: #009900;">&#40;</span>adc.<span style="color: #660066;">particle</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  particle.<span style="color: #660066;">bounds</span> <span style="color: #339933;">=</span> bounds<span style="color: #339933;">;</span>
  particle.<span style="color: #660066;">context</span> <span style="color: #339933;">=</span> context<span style="color: #339933;">;</span>
  particle.<span style="color: #660066;">x</span> <span style="color: #339933;">=</span> <span style="">Math</span>.<span style="color: #660066;">random</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">*</span> bounds.<span style="color: #660066;">x2</span><span style="color: #339933;">;</span>
  particle.<span style="color: #660066;">y</span> <span style="color: #339933;">=</span> <span style="">Math</span>.<span style="color: #660066;">random</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">*</span> bounds.<span style="color: #660066;">y2</span><span style="color: #339933;">;</span>
  particle.<span style="color: #660066;">vx</span> <span style="color: #339933;">=</span> <span style="">Math</span>.<span style="color: #660066;">random</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">*</span> <span style="color: #CC0000;">10</span> <span style="color: #339933;">-</span> <span style="color: #CC0000;">5</span><span style="color: #339933;">;</span>
  particle.<span style="color: #660066;">vy</span> <span style="color: #339933;">=</span> <span style="">Math</span>.<span style="color: #660066;">random</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">*</span> <span style="color: #CC0000;">10</span> <span style="color: #339933;">-</span> <span style="color: #CC0000;">5</span><span style="color: #339933;">;</span>
  system.<span style="color: #660066;">addParticle</span><span style="color: #009900;">&#40;</span>particle<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #000066; font-weight: bold;">function</span> animate<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  context.<span style="color: #660066;">clearRect</span><span style="color: #009900;">&#40;</span>bounds.<span style="color: #660066;">x1</span><span style="color: #339933;">,</span> bounds.<span style="color: #660066;">y1</span><span style="color: #339933;">,</span> bounds.<span style="color: #660066;">x2</span><span style="color: #339933;">,</span> bounds.<span style="color: #660066;">y2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  system.<span style="color: #660066;">update</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  system.<span style="color: #660066;">render</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
  initSystem<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  initParticles<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  setInterval<span style="color: #009900;">&#40;</span>animate<span style="color: #339933;">,</span> <span style="color: #CC0000;">1000</span> <span style="color: #339933;">/</span> <span style="color: #CC0000;">60</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>El código en este archivo es contenido en una expresión de función que se invoca inmediatamente, de nuevo para evitar la contaminación del namespace. (Para más información de <a href="http://benalman.com/news/2010/11/immediately-invoked-function-expression/#iife">expresiones de función invocadas inmediatamente</a>, revisa el blog de Ben Alman donde habla del tema. Incluye el suplemento de Object.create para los navegadores que pudieran necesitarlo. Todo esto está reunido en el siguiente archivo HTML:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #339933;">&lt;!</span>DOCTYPE html<span style="color: #339933;">&gt;</span>
  <span style="color: #339933;">&lt;</span>html<span style="color: #339933;">&gt;</span>
  <span style="color: #339933;">&lt;</span>head<span style="color: #339933;">&gt;</span>
  <span style="color: #339933;">&lt;</span>title<span style="color: #339933;">&gt;</span>Particles v1<span style="color: #339933;">&lt;/</span>title<span style="color: #339933;">&gt;</span>
  <span style="color: #339933;">&lt;</span>style type<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;text/css&quot;</span><span style="color: #339933;">&gt;</span>
  .<span style="color: #660066;">html</span><span style="color: #339933;">,</span> body <span style="color: #009900;">&#123;</span>
  margin<span style="color: #339933;">:</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span>
  padding<span style="color: #339933;">:</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
  <span style="color: #339933;">&lt;/</span>style<span style="color: #339933;">&gt;</span>
&nbsp;
  <span style="color: #339933;">&lt;/</span>head<span style="color: #339933;">&gt;</span>
  <span style="color: #339933;">&lt;</span>body<span style="color: #339933;">&gt;</span>
  <span style="color: #339933;">&lt;</span>div<span style="color: #339933;">&gt;</span>
  <span style="color: #339933;">&lt;</span>canvas id<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;canvas&quot;</span><span style="color: #339933;">/&gt;</span>
  <span style="color: #339933;">&lt;/</span>div<span style="color: #339933;">&gt;</span>
&nbsp;
  <span style="color: #339933;">&lt;</span>script type<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;text/javascript&quot;</span> src<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;v1/particle.js&quot;</span><span style="color: #339933;">&gt;&lt;/</span>script<span style="color: #339933;">&gt;</span>
  <span style="color: #339933;">&lt;</span>script type<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;text/javascript&quot;</span> src<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;v1/particleSystem.js&quot;</span><span style="color: #339933;">&gt;&lt;/</span>script<span style="color: #339933;">&gt;</span>
  <span style="color: #339933;">&lt;</span>script type<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;text/javascript&quot;</span> src<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;v1/main.js&quot;</span><span style="color: #339933;">&gt;&lt;/</span>script<span style="color: #339933;">&gt;</span>
  <span style="color: #339933;">&lt;/</span>body<span style="color: #339933;">&gt;</span>
  <span style="color: #339933;">&lt;/</span>html<span style="color: #339933;">&gt;</span></pre></td></tr></table></div>

<p>Las líneas importantes, para el propósito de este artículo, son aquellas que crean el sistema de partículas:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;">system <span style="color: #339933;">=</span> <span style="">Object</span>.<span style="color: #660066;">create</span><span style="color: #009900;">&#40;</span>adc.<span style="color: #660066;">particleSystem</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Y las que crean a las mismas partículas:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;">particle <span style="color: #339933;">=</span> <span style="">Object</span>.<span style="color: #660066;">create</span><span style="color: #009900;">&#40;</span>adc.<span style="color: #660066;">particle</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  particle.<span style="color: #660066;">bounds</span> <span style="color: #339933;">=</span> bounds<span style="color: #339933;">;</span>
  particle.<span style="color: #660066;">context</span> <span style="color: #339933;">=</span> context<span style="color: #339933;">;</span>
  particle.<span style="color: #660066;">x</span> <span style="color: #339933;">=</span> <span style="">Math</span>.<span style="color: #660066;">random</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">*</span> bounds.<span style="color: #660066;">x2</span><span style="color: #339933;">;</span>
  particle.<span style="color: #660066;">y</span> <span style="color: #339933;">=</span> <span style="">Math</span>.<span style="color: #660066;">random</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">*</span> bounds.<span style="color: #660066;">y2</span><span style="color: #339933;">;</span>
  particle.<span style="color: #660066;">vx</span> <span style="color: #339933;">=</span> <span style="">Math</span>.<span style="color: #660066;">random</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">*</span> <span style="color: #CC0000;">10</span> <span style="color: #339933;">-</span> <span style="color: #CC0000;">5</span><span style="color: #339933;">;</span>
  particle.<span style="color: #660066;">vy</span> <span style="color: #339933;">=</span> <span style="">Math</span>.<span style="color: #660066;">random</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">*</span> <span style="color: #CC0000;">10</span> <span style="color: #339933;">-</span> <span style="color: #CC0000;">5</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Todavía no se ha implementado ningún tipo de función extendida, pero aquí se puede ver donde sería útil -llamando a extender una sola vez, en lugar de hacerlo después de cada línea en que se asignan propiedades. En la siguiente interacción, se agregara eso y algo más.</p>
<h3>Agregando extend e init</h3>
<p>Para la segunda versión del sistema de partículas, en vez de tener el archivo principal, crear y extender cada partícula por sí misma, sería mejor tener partículas que sepan cómo crear, extender e inicializarse a sí mismas. Para soportar eso, se pueden usar dos funciones nuevas, extend e init, las cuales son agregadas a adc.particle:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #000066; font-weight: bold;">var</span> adc <span style="color: #339933;">=</span> adc <span style="color: #339933;">||</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
  adc.<span style="color: #660066;">particle</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span>
  x<span style="color: #339933;">:</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">,</span>
  y<span style="color: #339933;">:</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">,</span>
  vx<span style="color: #339933;">:</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">,</span>
  vy<span style="color: #339933;">:</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">,</span>
  gravity<span style="color: #339933;">:</span> <span style="color: #CC0000;">0.0</span><span style="color: #339933;">,</span>
  bounce<span style="color: #339933;">:</span> <span style="color: #339933;">-</span><span style="color: #CC0000;">0.9</span><span style="color: #339933;">,</span>
  friction<span style="color: #339933;">:</span> <span style="color: #CC0000;">1.0</span><span style="color: #339933;">,</span>
  bounds<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">,</span>
  color<span style="color: #339933;">:</span> <span style="color: #3366CC;">&quot;#000000&quot;</span><span style="color: #339933;">,</span>
  context<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">,</span>
&nbsp;
  extend<span style="color: #339933;">:</span> <span style="color: #000066; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>props<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #000066; font-weight: bold;">var</span> prop<span style="color: #339933;">,</span> obj<span style="color: #339933;">;</span>
  obj <span style="color: #339933;">=</span> <span style="">Object</span>.<span style="color: #660066;">create</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #000066; font-weight: bold;">for</span><span style="color: #009900;">&#40;</span>prop <span style="color: #000066; font-weight: bold;">in</span> props<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>props.<span style="color: #000066;">hasOwnProperty</span><span style="color: #009900;">&#40;</span>prop<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  obj<span style="color: #009900;">&#91;</span>prop<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> props<span style="color: #009900;">&#91;</span>prop<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
  <span style="color: #009900;">&#125;</span>
  <span style="color: #000066; font-weight: bold;">return</span> obj<span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
&nbsp;
  init<span style="color: #339933;">:</span> <span style="color: #000066; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">x</span> <span style="color: #339933;">=</span> <span style="">Math</span>.<span style="color: #660066;">random</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">*</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">bounds</span>.<span style="color: #660066;">x2</span><span style="color: #339933;">;</span>
  <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">y</span> <span style="color: #339933;">=</span> <span style="">Math</span>.<span style="color: #660066;">random</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">*</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">bounds</span>.<span style="color: #660066;">y2</span><span style="color: #339933;">;</span>
  <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">vx</span> <span style="color: #339933;">=</span> <span style="">Math</span>.<span style="color: #660066;">random</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">*</span> <span style="color: #CC0000;">10</span> <span style="color: #339933;">-</span> <span style="color: #CC0000;">5</span><span style="color: #339933;">;</span>
  <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">vy</span> <span style="color: #339933;">=</span> <span style="">Math</span>.<span style="color: #660066;">random</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">*</span> <span style="color: #CC0000;">10</span> <span style="color: #339933;">-</span> <span style="color: #CC0000;">5</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
  <span style="color: #006600; font-style: italic;">// …</span>
  <span style="color: #006600; font-style: italic;">// rest of methods are the same as version 1</span>
  <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>El método extend se encarga de crear nuevos objetos, pasarle this como parámetro a Object.create. Así, hace una copia de sí mismo. Entonces toma las propiedades que hayan sido enviadas dentro de extend, las copia dentro del nuevo objeto que recién creó, y finalmente retorna el nuevo objeto.</p>
<p>Ahora, en lugar de llamar Object.create(adc.particle) y establecer y ajustar propiedad por propiedad, se puede llamar adc.particle.extend, pasándole un objeto con las propiedades que se le quieran establecer, y entonces llamar init en la partícula creada recientemente.</p>
<p>Cuando se agrega el método extend al sistema de partículas, el archivo principal llega a ser más simple. En initSystem, se llama a adc.particleSystem.extend() para crear el nuevo sistema. No se necesita agregar cualquier propiedad al sistema, así se llama a extend sin parámetros. No hay muchos cambios aquí:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #000066; font-weight: bold;">function</span> initSystem<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  system <span style="color: #339933;">=</span> adc.<span style="color: #660066;">particleSystem</span>.<span style="color: #660066;">extend</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  numParticles <span style="color: #339933;">=</span> <span style="color: #CC0000;">200</span><span style="color: #339933;">;</span>
  canvas <span style="color: #339933;">=</span> document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;canvas&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  context <span style="color: #339933;">=</span> canvas.<span style="color: #660066;">getContext</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;2d&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  canvas.<span style="color: #660066;">width</span> <span style="color: #339933;">=</span> window.<span style="color: #660066;">innerWidth</span><span style="color: #339933;">;</span>
  canvas.<span style="color: #660066;">height</span> <span style="color: #339933;">=</span> window.<span style="color: #660066;">innerHeight</span><span style="color: #339933;">;</span>
  bounds <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span>
  x1<span style="color: #339933;">:</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">,</span>
  y1<span style="color: #339933;">:</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">,</span>
  x2<span style="color: #339933;">:</span> canvas.<span style="color: #660066;">width</span><span style="color: #339933;">,</span>
  y2<span style="color: #339933;">:</span> canvas.<span style="color: #660066;">height</span>
  <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>En el método initParticles, hay una mejora:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #000066; font-weight: bold;">function</span> initParticles<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #000066; font-weight: bold;">var</span> i<span style="color: #339933;">,</span> particle<span style="color: #339933;">;</span>
  <span style="color: #000066; font-weight: bold;">for</span><span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> numParticles<span style="color: #339933;">;</span> i <span style="color: #339933;">+=</span> <span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  particle <span style="color: #339933;">=</span> adc.<span style="color: #660066;">particle</span>.<span style="color: #660066;">extend</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>
  bounds<span style="color: #339933;">:</span> bounds<span style="color: #339933;">,</span>
  context<span style="color: #339933;">:</span> context
  <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  particle.<span style="color: #660066;">init</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  system.<span style="color: #660066;">addParticle</span><span style="color: #009900;">&#40;</span>particle<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
  <span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Ahora se puede llamar a adc.particle.extend para crear cada partícula, pasándole un objeto que contiene los límites y el contexto, los cuales son copiados para cada partícula. Finalmente, se puede llamar a init en la nueva partícula, lo cual se encarga de establecer su posición y velocidad aleatoriamente. Esta versión trabaja exactamente igual que la última vez, pero la creación individual de partículas ha sido simplificado.</p>
<h3>Agregando herencia</h3>
<p>La tercera versión del sistema de partículas soporta herencia. Esto es clave para reusar código. Se tiene un tipo de objeto y se quiere hacer otro tipo de objeto que sea ligeramente diferente. No se quiere recrear completamente el primer objeto con un par de cambios.</p>
<p>La reutilización de código tiene dos beneficios importantes. Primero, hay menos código que escribir. Ciertamente no se querrá escribir el mismo código dos veces. Tampoco se quiere copiar y pegar código, ya que esto puede hacer que las cosas se salgan de sincronía, con una función implementada de una forma aquí y la misma función implementada un poco diferente por allá. El segundo beneficio es mejor rendimiento. Cuando se tiene el mismo código duplicado en la aplicación, toma más tiempo descargarla, consume más memoria, y puede causar que la ejecución del código sea lenta, particularmente en la inicialización de objetos (debido a que inicializa el mismo código una y otra vez).</p>
<p>Actualmente el sistema de partículas procesa en un canvas de HTML5. Ahora, se puede querer un tipo diferente de partículas que se procesen a sí mismas como un objeto DOM. Idealmente, casi todo el código de las partículas sería reutilizado, solo con un método de procesamiento diferente. Entonces, con gran confianza, se puede tomar particle.js y removerle el método render.</p>
<p>Después, hacer dos archivos nuevos, canvasParticle.js y comParticle.js. La versión de canvas será similar a lo que acabamos de hacer:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #000066; font-weight: bold;">var</span> adc <span style="color: #339933;">=</span> adc <span style="color: #339933;">||</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
  adc.<span style="color: #660066;">canvasParticle</span> <span style="color: #339933;">=</span> adc.<span style="color: #660066;">particle</span>.<span style="color: #660066;">extend</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>
  render<span style="color: #339933;">:</span> <span style="color: #000066; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">context</span> <span style="color: #339933;">===</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #000066; font-weight: bold;">throw</span> <span style="color: #000066; font-weight: bold;">new</span> Error<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;context needs to be set on particle&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
  <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">context</span>.<span style="color: #660066;">fillStyle</span> <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">color</span><span style="color: #339933;">;</span>
  <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">context</span>.<span style="color: #660066;">fillRect</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">x</span> <span style="color: #339933;">-</span> <span style="color: #CC0000;">1.5</span><span style="color: #339933;">,</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">y</span> <span style="color: #339933;">-</span> <span style="color: #CC0000;">1.5</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">3</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">3</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
  <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Este código es muy sencillo. Solo se llama a adc.particle.extend, pasándole un objeto que contenga el método render antiguo. Eso creará un nuevo objeto que tiene particle como su [[Prorotype]], y render como un nuevo método directamente en el objeto.</p>
<p>Después se tendrá que cambiar un poco a main.js para que permita los nuevos tipos de objetos. Crea un archivo mainCanvas.js para configurar las partículas basadas en canvas. Esto solo difería en una línea, donde utiliza el tipo adc.canvasParticle para inicializar las partículas, en lugar de solo adc.particle:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #000066; font-weight: bold;">function</span> initParticles<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #000066; font-weight: bold;">var</span> i<span style="color: #339933;">,</span> particle<span style="color: #339933;">;</span>
  <span style="color: #000066; font-weight: bold;">for</span><span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> numParticles<span style="color: #339933;">;</span> i <span style="color: #339933;">+=</span> <span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  particle <span style="color: #339933;">=</span> adc.<span style="color: #660066;">canvasParticle</span>.<span style="color: #660066;">extend</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>
  bounds<span style="color: #339933;">:</span> bounds<span style="color: #339933;">,</span>
  context<span style="color: #339933;">:</span> context
  <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  particle.<span style="color: #660066;">init</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  system.<span style="color: #660066;">addParticle</span><span style="color: #009900;">&#40;</span>particle<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
  <span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>El archivo particleSystem.js puede permanecer sin cambios, pero por supuesto el archivo HTML tendrá que reflejar los nuevos recursos que se han creado. Este ejemplo debería funcionar idénticamente a las primeras dos versiones.</p>
<p>Ahora estás listo para crear la versión DOM.</p>
<p>El archivo domParticle.js será casi tan sencillo como canvasParticle.js. Este asume que hay un elemento que puede posicionar, y lo hace utilizando propiedades de estilo:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;">adc.<span style="color: #660066;">domParticle</span> <span style="color: #339933;">=</span> adc.<span style="color: #660066;">particle</span>.<span style="color: #660066;">extend</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>
  render<span style="color: #339933;">:</span> <span style="color: #000066; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">element</span> <span style="color: #339933;">===</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #000066; font-weight: bold;">throw</span> <span style="color: #000066; font-weight: bold;">new</span> Error<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;element needs to be set on particle&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
  <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">element</span>.<span style="color: #660066;">style</span>.<span style="color: #660066;">left</span> <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">x</span><span style="color: #339933;">;</span>
  <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">element</span>.<span style="color: #660066;">style</span>.<span style="color: #660066;">top</span> <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">y</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
  <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Pero en este ejemplo, el archivo HTML y main.js necesitarán cambios importantes. Además de referenciar diferentes archivos fuente, el HTML puede eliminar el elemento canvas y agregar un contenedor div en el cual poner todas las partículas:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #339933;">&lt;</span>html<span style="color: #339933;">&gt;</span>
  <span style="color: #339933;">&lt;</span>head<span style="color: #339933;">&gt;</span>
  <span style="color: #339933;">&lt;</span>title<span style="color: #339933;">&gt;</span>Particles v3<span style="color: #339933;">&lt;/</span>title<span style="color: #339933;">&gt;</span>
  <span style="color: #339933;">&lt;</span>style type<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;text/css&quot;</span><span style="color: #339933;">&gt;</span>
  .<span style="color: #660066;">html</span><span style="color: #339933;">,</span> body <span style="color: #009900;">&#123;</span>
  margin<span style="color: #339933;">:</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span>
  padding<span style="color: #339933;">:</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span>
  overflow<span style="color: #339933;">:</span> hidden<span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
  <span style="color: #339933;">&lt;/</span>style<span style="color: #339933;">&gt;</span>
&nbsp;
  <span style="color: #339933;">&lt;/</span>head<span style="color: #339933;">&gt;</span>
  <span style="color: #339933;">&lt;</span>body<span style="color: #339933;">&gt;</span>
  <span style="color: #339933;">&lt;</span>div id<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;container&quot;</span><span style="color: #339933;">&gt;</span>
  <span style="color: #339933;">&lt;/</span>div<span style="color: #339933;">&gt;</span>
&nbsp;
  <span style="color: #339933;">&lt;</span>script type<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;text/javascript&quot;</span> src<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;v3/particle.js&quot;</span><span style="color: #339933;">&gt;&lt;/</span>script<span style="color: #339933;">&gt;</span>
  <span style="color: #339933;">&lt;</span>script type<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;text/javascript&quot;</span> src<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;v3/domParticle.js&quot;</span><span style="color: #339933;">&gt;&lt;/</span>script<span style="color: #339933;">&gt;</span>
  <span style="color: #339933;">&lt;</span>script type<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;text/javascript&quot;</span> src<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;v3/particleSystem.js&quot;</span><span style="color: #339933;">&gt;&lt;/</span>script<span style="color: #339933;">&gt;</span>
  <span style="color: #339933;">&lt;</span>script type<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;text/javascript&quot;</span> src<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;v3/mainDom.js&quot;</span><span style="color: #339933;">&gt;&lt;/</span>script<span style="color: #339933;">&gt;</span>
  <span style="color: #339933;">&lt;/</span>body<span style="color: #339933;">&gt;</span>
  <span style="color: #339933;">&lt;/</span>html<span style="color: #339933;">&gt;</span></pre></td></tr></table></div>

<p>El archivo main.js se convertirá en mainDom.js y obviamente necesitará cambiar un poco para crear domParticles y darles elementos individuales en vez de referencias al contexto del canvas:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
  <span style="color: #000066; font-weight: bold;">var</span> system<span style="color: #339933;">,</span>
  numParticles<span style="color: #339933;">,</span>
  container<span style="color: #339933;">,</span>
  bounds<span style="color: #339933;">;</span>
&nbsp;
&nbsp;
  <span style="color: #000066; font-weight: bold;">function</span> createElement<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #000066; font-weight: bold;">var</span> el <span style="color: #339933;">=</span> document.<span style="color: #660066;">createElement</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;div&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  el.<span style="color: #660066;">style</span>.<span style="color: #660066;">position</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;absolute&quot;</span><span style="color: #339933;">;</span>
  el.<span style="color: #660066;">style</span>.<span style="color: #660066;">width</span> <span style="color: #339933;">=</span> <span style="color: #CC0000;">3</span><span style="color: #339933;">;</span>
  el.<span style="color: #660066;">style</span>.<span style="color: #660066;">height</span> <span style="color: #339933;">=</span> <span style="color: #CC0000;">3</span><span style="color: #339933;">;</span>
  el.<span style="color: #660066;">style</span>.<span style="color: #660066;">backgroundColor</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;#000000&quot;</span><span style="color: #339933;">;</span>
  container.<span style="color: #660066;">appendChild</span><span style="color: #009900;">&#40;</span>el<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #000066; font-weight: bold;">return</span> el<span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #000066; font-weight: bold;">function</span> initSystem<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  system <span style="color: #339933;">=</span> adc.<span style="color: #660066;">particleSystem</span>.<span style="color: #660066;">extend</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  numParticles <span style="color: #339933;">=</span> <span style="color: #CC0000;">200</span><span style="color: #339933;">;</span>
  container <span style="color: #339933;">=</span> document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;container&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  bounds <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span>
  x1<span style="color: #339933;">:</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">,</span>
  y1<span style="color: #339933;">:</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">,</span>
  x2<span style="color: #339933;">:</span> window.<span style="color: #660066;">innerWidth</span><span style="color: #339933;">,</span>
  y2<span style="color: #339933;">:</span> window.<span style="color: #660066;">innerHeight</span>
  <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #000066; font-weight: bold;">function</span> initParticles<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #000066; font-weight: bold;">var</span> i<span style="color: #339933;">,</span> particle<span style="color: #339933;">;</span>
  <span style="color: #000066; font-weight: bold;">for</span><span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> numParticles<span style="color: #339933;">;</span> i <span style="color: #339933;">+=</span> <span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
  particle <span style="color: #339933;">=</span> adc.<span style="color: #660066;">domParticle</span>.<span style="color: #660066;">extend</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>
  bounds<span style="color: #339933;">:</span> bounds<span style="color: #339933;">,</span>
  element<span style="color: #339933;">:</span> createElement<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
  <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  particle.<span style="color: #660066;">init</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  system.<span style="color: #660066;">addParticle</span><span style="color: #009900;">&#40;</span>particle<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #000066; font-weight: bold;">function</span> animate<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  system.<span style="color: #660066;">update</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  system.<span style="color: #660066;">render</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
&nbsp;
  initSystem<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  initParticles<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  setInterval<span style="color: #009900;">&#40;</span>animate<span style="color: #339933;">,</span> <span style="color: #CC0000;">1000</span> <span style="color: #339933;">/</span> <span style="color: #CC0000;">60</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Esto hace uso de una nueva función, createElement, que solamente crea un div, lo estiliza, y lo agrega al contenedor div. Esto es lo que posicionara las partículas cuando se llame al método render.</p>
<p>Este último ejemplo debería ser casi idéntico al de todas las otras versiones. Por supuesto, hay muchas formas de optimización y mejoras que se pueden hacer para mejorar todos estos ejemplos. A propósito lo hice sencillo para ilustrar mejor el aspecto de la herencia.</p>
<h2>A dónde ir desde aquí</h2>
<p>Puede que aún prefieras funciones constructoras y el operador new. Personalmente encuentro este método de creación de objetos muy limpio y de acuerdo a la naturaleza básica de prototipos de JavaScript.</p>
<p>Te invito a explorar el código fuente proporcionado en los archivos de ejemplo de este tutorial y probar el sistema de partículas en un navegador que soporte HTML5.</p>
<p>A medida que tu necesidad de aplicaciones más complejas crezca, puedes agregar características dentro de esta configuración básica. Para más información, revisa los siguientes recursos:</p>
<p><a href="http://javascript.crockford.com/prototypal.html">Herencia de Prototipos en JavaScript</a>, de Douglas Crockford<br />
<a href="http://www.crockford.com/javascript/inheritance.html">Herencia Clásica en JavaScript</a>, de Douglas Crockford<br />
<a href="http://javascriptjabber.com/005-jsj-javascript-objects/">Objetos JavaScript 005 JSJ</a>, de WOODY2SHOES</p>
<p>La versión original de este artículo está publicada en <a href="http://www.adobe.com/devnet/html5/articles/javascript-object-creation.html">Adobe Devnet</a> bajo licencia Creative Commons, fue traducido y adaptado en nuestro blog por <a href="https://twitter.com/jesus_macedo">Jesús Macedo</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://activ.com.mx/fundamentos-de-oop-en-javascript/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Detrás de la Arquitectura del Código de Brackets</title>
		<link>http://activ.com.mx/detra-de-la-arquitectura-del-codigo-de-brackets/</link>
		<comments>http://activ.com.mx/detra-de-la-arquitectura-del-codigo-de-brackets/#comments</comments>
		<pubDate>Wed, 12 Dec 2012 07:51:34 +0000</pubDate>
		<dc:creator>gr_maggi</dc:creator>
				<category><![CDATA[Adobe]]></category>
		<category><![CDATA[Articulos]]></category>
		<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[articulos]]></category>
		<category><![CDATA[desarrollo]]></category>
		<category><![CDATA[edge]]></category>
		<category><![CDATA[herramientas]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://activ.com.mx/?p=5160</guid>
		<description><![CDATA[Brackets, el nuevo editor de código para la web, es un proyecto bastante ambicioso en muchos niveles, es una herramienta que está escrita utilizando HTML, CSS y JavaScript; los desarrolladores están utilizando al mismo Brackets en la gran mayoría. En un momento cuando las discusiones acerca de las mejores prácticas para el desarrollo de aplicaciones web, nunca habían [...]]]></description>
				<content:encoded><![CDATA[<p><a href="https://github.com/adobe/brackets">Brackets</a>, el nuevo editor de código para la web, es un proyecto bastante ambicioso en muchos niveles, es una herramienta que está escrita utilizando HTML, CSS y JavaScript; los desarrolladores están utilizando al mismo Brackets en la gran mayoría.</p>
<p style="text-align: center"><img src="http://activ.com.mx/wp-content/uploads/2012/12/brackets.jpg" alt="Brackets logo" /></p>
<p>En un momento cuando las discusiones acerca de las mejores prácticas para el desarrollo de aplicaciones web, nunca habían estado tan animadas con Brackets, que es de código abierto, es una gran oportunidad para los desarrolladores para presenciar cómo se puede construir un proyecto complejo de la vida real basado en estándares web. Mientras que el editor de código se encuentra todavía en su infancia (Sprint 11 se acaba de lanzar en el momento de escribir estas líneas), ya hay muchas cosas que puedes aprender al estudiar su código fuente actual.</p>
<p><span id="more-5160"></span></p>
<h2>Organización General</h2>
<p>Brackets está alojado en <a href="https://github.com/">GitHub</a>, dentro de dos repositorios diferentes: uno del código fuente principal, responsable del <a href="https://github.com/adobe/brackets">núcleo de la aplicación web</a>; el otro contiene el <a href="https://github.com/adobe/brackets-app/">recurso nativo de la aplicación shell</a>, lo que hace posible que el editor se ejecute como una aplicación independiente para Windows y Mac OS (antes de preguntar. si, Linux está en la ruta). Por esta aplicación nativa shell, Brackets utiliza el <a href="http://code.google.com/p/chromiumembedded/">framework de Chromium Embedded</a>, que incorpora una versión de <a href="http://www.webkit.org/">WebKit</a>.</p>
<p>La razón de esta preocupación en cuanto a la separación, podría ser obvia:</p>
<p>Brackets tiene el potencial para ser ejecutado en muchos lugares fuera de las aplicaciones de escritorio nativas. Esta universalidad es la principal fortaleza de los estándares web, y es lo que hace que el proyecto sea tan emocionante, si quieres pregúntame.</p>
<p>En términos de organización de archivos, el repositorio central de Brackets tiene una estructura de carpetas bastante auto-explicativa, además está muy bien documentado, así que creo que no es necesario detallar todos y cada uno de ellos secuencialmente aquí. En cambio, prefiero destacar los distintos aspectos que me llamaron la atención como desarrollador.</p>
<h2>Convenciones de código principal</h2>
<p>Un vistazo rápido a cualquier archivo JavaScript en el repositorio responderá a una pregunta común acerca de las aplicaciones web modernas: Sí, el código JavaScript de Brackets está escrito usando módulos. Esto no debería sorprenderte. Los módulos son una gran forma para proporcionar un ámbito claro, limitado y una adecuada encapsulación de código JavaScript. Es también una estupenda forma para proporcionar un nivel básico de privacidad, ya que sólo los miembros expuestos a través del objeto devuelto están públicamente disponibles.</p>
<p>Como puedes saber, hay varias propuestas de formato para los módulos, pero sólo dos son realmente usadas hoy en día: <a href="http://www.commonjs.org/specs/modules/1.0/"> CommonJS Modules JS</a> y <a href="https://github.com/amdjs/amdjs-api/wiki/AMD">AMD</a> (Definición de Módulo Asíncrono). El equipo de Brackets ha elegido un enfoque híbrido: utiliza el formato de CommonJS dentro de contenedores compatibles de AMD:</p>
<pre>define(function (require, exports, module) {
  var otherModule = require("path/to/required/Module");
  var _privateStuff="I'm private";
  var publicStuff="I need to be accessed from outside";
  function doStuff(){
  console.log(publicStuff);
  }
  // Exposing public members through the exports object
  exports.doStuff=doStuff;
  exports.publicStuff= publicStuff;
  });</pre>
<p>Observa que no se utiliza el parámetro del módulo: es sólo para el cumplimiento de CommonJS. También, los módulos son cargados mediante el popular modulo/script <a href="http://requirejs.org/">RequireJS</a>. Para más información sobre módulos y cargadores de modulo, recomiendo leer el escrito de Addy Osmani Acerca de <a href="http://addyosmani.com/writing-modular-js/">JavaScript Modular</a>. Por cierto, algo importante que debes tener en mente es que un módulo y su correspondiente archivo, puede definir cero, una, o muchas clases. Así que si estás buscando una definición de clase, no es necesario buscar el nombre del archivo correspondiente.</p>
<p>Otra cosa un poco interesante que puedes encontrar mientras pases por el repositorio es el uso de un mecanismo diferido/promesa. Brevemente, es un mecanismo de respaldo de llamada en el cual un objeto diferido puede registrarse y enlazar múltiples funciones de respaldo de llamadas, y llamarlas de acuerdo a su estado (Por lo general, pendiente, satisfactorio o fracaso). Este patrón se utiliza para controlar las APIs asíncronas, las cuales son necesarias únicamente sí en una versión hospedad del navegador del editor, todas la operaciones I/O serían asíncronas. Para aprender más acerca de este patrón, te recomiendo leer <a href="http://api.jquery.com/category/deferred-object/">the Deferred Object in the jQuery docs</a> o <a href="http://wiki.commonjs.org/wiki/Promises/A">CommonJS Promises/A proposal</a>.</p>
<p>En caso de que te estés preguntando, Brackets no utiliza cualquier framework de micro arquitectura de terceros. Encontrarás algunos conceptos comunes como: modelos, vistas y controles, pero no formalizados alrededor de un mecanismo en particular.</p>
<p>Por último, hay una página en el wiki que describe las convenciones de código utilizadas para Brackets. Aunque nada de lo que vi debería sorprender a cualquier desarrollador JavaScript, creo es importante para un proyecto abierto, acordar y comunicar sobre esas prácticas, aunque son bastante comunes.</p>
<h2>Administración de documentos y edición de código</h2>
<p>Mucho de lo que hace a Brackets una gran herramienta para editar el código proviene de la utilización de un gran proyecto de terceros: <a href="http://codemirror.net/">CodeMirror</a>. Todo sobre el diseño de un documento de texto, que representa al código y el modificarlo en forma adecuada, proviene de CodeMirror, incluyendo la gestión de sintaxis y enfoque.</p>
<p>La administración de proyectos y los documentos, sin embargo, se manejan por separado. Esta es la lógica responsable de cosas como la definición de un proyecto o un conjunto de trabajo, seleccionar un archivo y realizar el seguimiento de los archivos abiertos dentro de ese proyecto. Si bien esto puede parecer trivial cuando se ponen así, esto es realmente parte fundamental de cualquier software diseñado para editar documentos.</p>
<p>Varias clases están involucradas en este proceso, como son Document, Editor y sus respectivos administradores, y así entender que su relación es esencial para comprender la arquitectura de Brackets.</p>
<p>Mientras que un documento representa un archivo y expone métodos para editarlo mediante programación, un Editor encapsula la interfaz de usuario para editar el documento. Documentos y editores tienen una relación uno a muchos (un documento puede ser editado por varios Editores). Puedes ver el Documento como un modelo y el Editor como un intermediario entre una vista y, el Documento representado como un objeto.</p>
<p>El DocumentManager y el EditorManager pueden crear, eliminar clases, y así proporcionar un acceso central para todos los documentos y editores, respectivamente. Por ejemplo, para acceder documento actual, puedes pedir el DocumentManager:</p>
<pre>var currentDoc = DocumentManager.getCurrentDocument();</pre>
<p>Pero ya que el editor sigue revisando el documento que se está editando, y el EditorManager administra todos los editores; también podría ir de esta manera:</p>
<pre>var currentDoc = EditorManager.getFocusedEditor().document;</pre>
<p>Observa que el Editor actual y su correspondiente documento no necesariamente corresponden a la pestaña abierta actualmente en la interfaz de usuario, ya que Brackets tienen una noción de editores en línea que pueden venir en la parte superior del editor principal en tamaño completo, que representa el documento abierto actualmente.</p>
<p>Los editores resumen la aplicación de CodeMirror, proporcionando métodos para obtener y establecer la selección, posición del cursor, posición de desplazamiento y otras propiedades. La API de CodeMirror puede aún ser accedida directamente a través de CodeMirror, pero debes utilizar los métodos de Documentos o Editor.</p>
<p>El API Document expone las operaciones de edición de texto como setText() y replaceRange(), que automáticamente se refleja en todos los Editores asociados con ese Documento. Por lo tanto, para modificar el texto, simplemente usa la API Document, independientemente de los Editores:</p>
<pre>currentDoc.replaceRange("Hello world", startPosition, endPosition);</pre>
<p>La administración de selección, sin embargo, está relacionada con una vista correspondiente, por lo que solo está disponible a través del objeto Editor, utilizando métodos como getSelectedText() y setSelection(start, end). Aquí cómo podrías definir la selección del documento que actualmente tiene el foco:</p>
<pre>EditorManager.getFocusedEditor().setSelection({line:0, ch:0}, {line:0, ch:5});</pre>
<p>Finalmente, una advertencia: como solución para evitar la falta de referencias en JavaScript, sí, cuando es necesario hacer una referencia de un objeto Document, tienes que llamar a Document.addRef() y, por el contrario Document.releaseRef() cuando hayas terminado. Esto incluye todos los detectores de eventos anexados al documento.</p>
<p>Para más información sobre Documents en Brackets, recomiendo leer<a href="https://github.com/adobe/brackets/wiki/Brackets-Development-How-Tos#wiki-doc"> la sección dedicada en su github wiki.</a></p>
<h2>Desarrollo directo y editores en línea</h2>
<p>Una de las cosas que hace que Brackets sea único hoy en día es su característica de desarrollo directo: Brackets está “conectado” a el navegador de tal manera que mientras se va escribiendo se van mostrando los cambios en el navegador. No hace falta decir, que esto es una característica potencialmente asesina en términos de productividad.</p>
<p>El corazón de la implementación del desarrollo directo es el archivo Inspector.js, la cual está a cargo de la comunicación con el API remota de depuración de Chrome utilizando JSON sobre WebSockets. Otros elementos envueltos en este proceso incluyen Agentes &#8211; los cuales mantienen un seguimiento de los cambios y los propagan- y Documents los cuales, de nuevo, representan archivos CSS, JS y HTML en el sistema (no los confundas con la clase genérica descrita arriba)</p>
<p>La característica de editor en línea, que hace posible sobreponer contenido sobre código, es implementada a través de la clase InlineWidget (la base de los editores en línea, que es solo un panel que flota sobre el código). La clase InlineTextEditor es ligeramente más sofisticada: hereda de InlineWidget y agrega un editor de texto sencillo.</p>
<p>La clase que se utilizará para crear un editor en línea, como el editor en línea de CSS de Brackets, es MultiRangeInlineEditor, la cual misma hereda de InlineTextEditor.</p>
<p>Para utilizar un editor en línea, se tiene que registrar una función proveedora con el EditorManager, de esta forma:</p>
<p>EditorManager.registerInlineEditProvider(providerFunction);</p>
<p>Esta función toma dos parámetros: el editor que hospeda y un objeto de posición. Los objetos de posición son utilizados por CodeMirror y contiene dos propiedades: el número de línea y la posición del carácter. Dentro de esta función, simplemente se instancia a MultiRangeInlineEditor y se le pasa la instancia de Editor correspondiente, retornando un objeto Promise (ver arriba) que es resuelto una vez que está completo:</p>
<h2>Vistas y administración de la entrada del usuario</h2>
<pre> function providerFunction(hostEditor, pos){
   //Create an instance of InlineTextEditor or one of its subclasses 
   var myInlineEditor = new MyMultiRangeInlineEditor(data);
   myInlineEditor.load(hostEditor);

   //Only handle cases where this inlineEditor makes sense
   // and leave the place to other editors for all other cases
   if(notRelevantContext) return null

   //Assume this will be asynchronous
   var result = new $.Deferred();
   result.resolve(myInlineEditor);        
   return result.promise();
}</pre>
<p>No profundizaré mucho en estilos, widgets, layouts, u otros detalles de UI, pero me gustaría señalar que, además de jQuery, Brackets hace uso del popular <a href="http://twitter.github.com/bootstrap/">framework Twitter Bootstrap</a> para su UI elegante que significa que también utiliza <a href="http://lesscss.org/">LESS CSS preprocessor</a>.</p>
<p>Brackets no utiliza ningún sistema de plantillas. Muchas de las UI están hardcodeadas en el archivo HTML principal. A mi parecer esto podría cambiar en el futuro.</p>
<p>Lo más importante de comprender es la forma en que Brackets maneja la entrada del usuario. Para hacerlo, hace uso del patrón Command. Este patrón encapsula acciones que serán realizadas por el software (por ejemplo “abrir archivo”) como objetos (el comando). Esto es muy conveniente para trazar los gestos del usuario y la entrada de estos objetos, por muchas razones:</p>
<p>1. Permite el desacoplamiento de las interacciones del usuario de su consecuencia en el editor, lo cual ofrece un código más fácil de mantener.</p>
<p>2. Ya que las acciones son tratadas como objetos, pueden mantener un estado, y se pueden realizar todas las operaciones en estas. Por ejemplo, si se deshabilita un comando, o cambia su etiqueta, sus elementos de UI correspondientes serán automáticamente actualizados. Este también es un patrón popular para implementar cosas básicas como una administración de historial y herramientas de scripting, así que también puedes esperar estas características en el futuro.</p>
<p>3. Hace el código más fácil de probar.</p>
<p>En términos de implementación, registrar un comando es tan fácil como esto:</p>
<pre>CommandManager.register(label, commandID, callback);</pre>
<p>Entonces se puede adjuntarlo a un elemento de menú para que sea ejecutado cuando este elemento sea seleccionado por el usuario:</p>
<pre>var menu = Menus.getMenu(Menus.AppMenuBar.FILE_MENU);
menu.addMenuItem(commandID);</pre>
<p>Aunque también se puede ejecutar manualmente:</p>
<pre>CommandManager.execute(commandID);</pre>
<h2>Calidad</h2>
<p>El código de calidad es absolutamente esencial para cualquier proyecto serio, y por supuesto Brackets no es la excepción. Utiliza <a href="http://www.jslint.com/">JSLint</a> para evaluar la calidad del código. JSLint es una de las herramientas más populares de análisis para JavaScript estático. Fue hecho por Douglas Crockford como una forma de escanear código fácilmente y reportar cualquier problema, como describe en su mecanismo de configuración basado en comentarios.</p>
<p>Encontrarás las directivas de configuración de JSLint al inicio de cada módulo:</p>
<pre>/*jslint vars: true, plusplus: true, devel: true, nomen: true, indent: 4, forin: true, maxerr: 50, regexp: true */
/*global define, $, FileError, brackets, window */</pre>
<p>Nota que JSLint también es utilizado en Brackets para proporcionar a los desarrolladores retroalimentación inmediata acerca de la calidad de su código.</p>
<p>Brackets también utiliza un framework de pruebas, <a href="http://pivotal.github.com/jasmine/">Jasmine</a>, para garantizar la calidad del código. Jasmine es un framework popular de <a href="http://en.wikipedia.org/wiki/Behavior_Driven_Development">desarrollo de comportamiento dirigido</a>, utilizado para el desarrollo de JavaScript.</p>
<p>Se ha incluido un realizador de pruebas (en Debug &gt; Run Tests), así que puede ser fácilmente probado, desde sí mismo.</p>
<h2>Modelo de extensibilidad temprana</h2>
<p>Se incluyó un mecanismo de extensibilidad temprana, permitiendo a los usuarios a extender la funcionalidad de Brackets fácilmente sin tener que poner parches en el núcleo del código. El flujo de trabajo típico para hacerlo sería el ejecutar una segunda instancia de brackets para probar el código actual, utilizando Debug &gt; New Window.</p>
<p>La extensión misma esta descrita como un módulo, pero en alguna forma separa el alcance del resto del código fuente. Para cargar dependencias desde Brackets, se tiene que utilizar brackets.getModule().</p>
<p>Aquí hay una extensión completa de <a href="https://github.com/adobe/brackets/wiki/Simple-%22Hello-World%22-extension">Hello World</a> escrito originalmente por Mike Chambers:</p>
<pre>/*jslint vars: true, plusplus: true, devel: true, nomen: true, regexp: true, indent: 4, maxerr: 50 */
/*global define, $, brackets, window */
/** Simple extension that adds a "File &gt; Hello World" menu item */
define(function (require, exports, module) {
   'use strict';
   var CommandManager = brackets.getModule("command/CommandManager"),
       Menus          = brackets.getModule("command/Menus");
   // Function to run when the menu item is clicked
   function handleHelloWorld() {
       window.alert("Hello, world!");
   }
   // First, register a command - a UI-less object associating an id to a handler
   var MY_COMMAND_ID = "helloworld.sayhello";
   CommandManager.register("Hello World", MY_COMMAND_ID, handleHelloWorld);
   // Then create a menu item bound to the command
   // The label of the menu item is the name we gave the command (see above)
   var menu = Menus.getMenu(Menus.AppMenuBar.FILE_MENU);
   menu.addMenuItem(MY_COMMAND_ID);
   // We could also add a key binding at the same time:
   //menu.addMenuItem(MY_COMMAND_ID, "Ctrl-Alt-H");
   // (Note: "Ctrl" is automatically mapped to "Cmd" on Mac)
   // Or you can add a key binding without having to create a menu item:
   //KeyBindingManager.addBinding(MY_COMMAND_ID, "Ctrl-Alt-H");
   // For dynamic menu item labels, you can change the command name at any time:
   //CommandManager.get(MY_COMMAND_ID).setName("Goodbye!");
});</pre>
<p>Lo genial es que tu extensión puede tomar ventaja de muchas de las características de Brackets, como el mecanismo del editor en línea.</p>
<h2>A dónde ir desde aquí</h2>
<p>Espero que esta visión a alto nivel te haga querer saber más acerca de este proyecto, e incluso contribuyas en Brackets.</p>
<p>Para un comprendimiento más profundo acerca de cómo funciona Brackets, te recomiendo dar un vistazo a la <a href="https://github.com/adobe/brackets/wiki">wiki de Brackets</a>. Hay varios videos en YouTube desde el <a href="http://www.youtube.com/watch?v=xm9kSWZyawg&amp;list=PL69EAABFC3B569526&amp;index=2&amp;feature=plpp_video">primer hackathon de Brackets</a>, pero algunas cosas que se mencionan ahí están desactualizadas, así que no las tomes tan enserio.</p>
<p>Este artículo está publicado bajo licencia Creative Commons así como su versión original en <a href="http://www.adobe.com/devnet/html5/articles/bracket-code-architecture.html">Adobe Devnet</a>, fue traducida y adaptada en nuestro blog por <a href="http://twitter.com/gr_maggi">Margarita García</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://activ.com.mx/detra-de-la-arquitectura-del-codigo-de-brackets/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Un vistazo a LocalStorage en HTML5</title>
		<link>http://activ.com.mx/un-vistazo-a-localstorage-en-html5/</link>
		<comments>http://activ.com.mx/un-vistazo-a-localstorage-en-html5/#comments</comments>
		<pubDate>Tue, 11 Dec 2012 17:36:35 +0000</pubDate>
		<dc:creator>jesus_macedo</dc:creator>
				<category><![CDATA[Articulos]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[almacenamiento]]></category>
		<category><![CDATA[articulos]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[localstorage]]></category>

		<guid isPermaLink="false">http://activ.com.mx/?p=5156</guid>
		<description><![CDATA[Una de las características más interesantes en HTML5 es la posibilidad de almacenar datos localmente y permitir que la aplicación se ejecute offline. Hay tres APIs diferentes que tratan con esas características y elegir una depende de que quieres hacer exactamente con los datos que estas planeando almacenar localmente: Almacenamiento Web: Para almacenamiento local básico [...]]]></description>
				<content:encoded><![CDATA[<p>Una de las características más interesantes en HTML5 es la posibilidad de almacenar datos localmente y permitir que la aplicación se ejecute offline. Hay tres APIs diferentes que tratan con esas características y elegir una depende de que quieres hacer exactamente con los datos que estas planeando almacenar localmente:</p>
<ul>
<li>Almacenamiento Web: Para almacenamiento local básico con pares clave/valor.</li>
<li>Almacenamiento Offline: Usa un manifiesto para almacenar archivos completos para su uso oflline.</li>
<li>Base de Datos Web: Para almacenamiento en bases de datos relacionales.</li>
</ul>
<p style="text-align:center"><img src="http://activ.com.mx/wp-content/uploads/2012/12/localstorage1.jpg" alt="LocalStorage HTML5" title="LocalStorage HTML5" width="380" height="193" class="aligncenter size-full wp-image-5198" /></p>
<p><span id="more-5156"></span></p>
<h2>API de almacenamiento web</h2>
<p>La implementación más básica para almacenar datos localmente en la máquina del usuario es con la API de almacenamiento web. Esta API utiliza pares clave/valor para permitir a los desarrolladores almacenar información básica y variables que pueden ser utilizadas por la aplicación web. Un caso de uso ideal para esto es el almacenamiento simple de datos que necesitan permanecer persistentes después de que el usuario ha navegado fuera de nuestra aplicación o ha cerrado el navegador. Guardando el estado de un juego, guardando una ubicación de navegación, o almacenando información específica que se quiere utilizar a través de la aplicación web (como el nombre de usuario) pero para lo cual no se quiere utilizar cookies. Se puede utilizar un API  similar para almacenar datos en una sesión individual. Los datos se borran automáticamente después de que el usuario ha navegado fuera de la aplicación o ha cerrado el navegador.</p>
<p>Se necesita considerar lo siguiente cuando se utilice el API  de almacenamiento web:</p>
<ul>
<li>El almacenamiento es para todo el dominio, así que cuando la aplicación guarda algo utilizando el almacenamiento web, los datos solamente son accesibles por otros sitios de ese dominio.</li>
<li>Las restricciones de almacenamiento de datos es de 5 megabytes. Este límite fue <a href="http://dev.w3.org/html5/webstorage/#disk-space">sugerido por la W3C</a> pero la especificación proporciona cierto margen para los detalles de implementación, así que el verdadero límite depende en los proveedores de navegadores.  </li>
</ul>
<h3>Revisando el soporte de los navegadores</h3>
<p>Para utilizar el API de almacenamiento web debemos asegurarnos de que el navegador del usuario lo soporta:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #000066; font-weight: bold;">function</span> checkLocalStorageSupport<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><span style="color: #339933;">&lt;</span>br <span style="color: #339933;">/&gt;</span>
 <span style="color: #000066; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span><span style="color: #339933;">&lt;</span>br <span style="color: #339933;">/&gt;</span>
   <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #3366CC;">'localStorage'</span> <span style="color: #000066; font-weight: bold;">in</span> window <span style="color: #339933;">&amp;&amp;</span> window<span style="color: #009900;">&#91;</span><span style="color: #3366CC;">'localStorage'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">!==</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">;&lt;</span>br <span style="color: #339933;">/&gt;</span>
 <span style="color: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span>e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><span style="color: #339933;">&lt;</span>br <span style="color: #339933;">/&gt;</span>
   <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #339933;">;&lt;</span>br <span style="color: #339933;">/&gt;</span>
 <span style="color: #009900;">&#125;</span><span style="color: #339933;">&lt;</span>br <span style="color: #339933;">/&gt;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>El almacenamiento web utiliza un objeto llamado localStorage, el cual es un objeto de windowclass. El código de arriba revisa si localStorage es un objeto de window y entonces devolverá true, así la aplicación puede aprovechar el API  de almacenamiento local.</p>
<h3>Agregando y retornando datos</h3>
<p>Agregar y retornar datos desde el objeto localStorage es tan fácil como llamar un método getter y setter que son implementados por la especificación de almacenamiento local. Se puede almacenar cualquier tipo de dato utilizando localStorage, pero todo se almacena como string dentro del área de almacenamiento. Esto significa que puede ser necesario convertir los datos antes de enviarlos a localStorage o después de utilizarlo. Por ejemplo, para almacenar un objeto de JavaScript, utilizando JSON y llamando stringify() antes de parse() sería necesario después de haber recuperado los datos. Es lo mismo para convertir variables numéricas una vez que han sido devueltas desde el objeto localStorage.</p>
<p>En este ejemplo, se establece un input sencillo para que cuando el usuario envíe los datos sean almacenados en el área de almacenamiento local. Si los datos ya fueron almacenados, cuando se cargue la página mostrará la información almacenada con un saludo. Esta es la función que se llama cuando el usuario envía los datos:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #000066; font-weight: bold;">function</span> onClick<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">&lt;</span>br <span style="color: #339933;">/&gt;</span>
  <span style="color: #009900;">&#123;</span><span style="color: #339933;">&lt;</span>br <span style="color: #339933;">/&gt;</span>
  <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>checkLocalStorageSupport<span style="color: #009900;">&#41;</span><span style="color: #339933;">&lt;</span>br <span style="color: #339933;">/&gt;</span>
  <span style="color: #009900;">&#123;</span><span style="color: #339933;">&lt;</span>br <span style="color: #339933;">/&gt;</span>
  window.<span style="color: #660066;">localStorage</span>.<span style="color: #660066;">setItem</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;name&quot;</span><span style="color: #339933;">,</span>document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;name&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">value</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;&lt;</span>br <span style="color: #339933;">/&gt;</span>
  <span style="color: #009900;">&#125;</span><span style="color: #339933;">&lt;</span>br <span style="color: #339933;">/&gt;</span>
  <span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Esta función utiliza el método setItem en el objeto localStorage y usa el valor del form para llenar el almacenamiento local. Cuando se carga la página, la aplicación tiene una función onLoad que revisa si hay datos almacenados y les agrega un saludo.</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #000066; font-weight: bold;">function</span> onLoad<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">&lt;</span>br <span style="color: #339933;">/&gt;</span>
  <span style="color: #009900;">&#123;</span><span style="color: #339933;">&lt;</span>br <span style="color: #339933;">/&gt;</span>
  <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>checkLocalStorageSupport<span style="color: #009900;">&#41;</span><span style="color: #339933;">&lt;</span>br <span style="color: #339933;">/&gt;</span>
  <span style="color: #009900;">&#123;</span><span style="color: #339933;">&lt;</span>br <span style="color: #339933;">/&gt;</span>
  <span style="color: #000066; font-weight: bold;">var</span> name <span style="color: #339933;">=</span> window.<span style="color: #660066;">localStorage</span>.<span style="color: #660066;">getItem</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;name&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;&lt;</span>br <span style="color: #339933;">/&gt;</span>
  <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>name <span style="color: #339933;">!=</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">&lt;</span>br <span style="color: #339933;">/&gt;</span>
  <span style="color: #009900;">&#123;</span><span style="color: #339933;">&lt;</span>br <span style="color: #339933;">/&gt;</span>
  window.<span style="color: #660066;">document</span>.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;divName&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">innerHTML</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;Bienvenido &quot;</span> <span style="color: #339933;">+</span> name<span style="color: #339933;">;</span>    <span style="color: #339933;">&lt;</span>br <span style="color: #339933;">/&gt;</span>
  <span style="color: #009900;">&#125;</span><span style="color: #339933;">&lt;</span>br <span style="color: #339933;">/&gt;</span>
  <span style="color: #339933;">&lt;</span>br <span style="color: #339933;">/&gt;</span>
  <span style="color: #009900;">&#125;</span><span style="color: #339933;">&lt;</span>br <span style="color: #339933;">/&gt;</span>
  <span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<h3>Borrando datos</h3>
<p>Mientras que los usuarios pueden borrar los datos en localStorage utilizando su navegador. puede tener más sentido darles la opción de borrar los datos desde la aplicación. localStorage tiene un método clear() que justamente hace eso. El código de abajo se ejecuta cuando el usuario da clic al boton reset en la aplicación. Si se quiere remover un elemento específico, se puede usar el método removeItem() para eliminar una sola llave del almacenamiento local.</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #000066; font-weight: bold;">function</span> onReset<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">&lt;</span>br <span style="color: #339933;">/&gt;</span>
  <span style="color: #009900;">&#123;</span><span style="color: #339933;">&lt;</span>br <span style="color: #339933;">/&gt;</span>
  <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>checkLocalStorageSupport<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">&lt;</span>br <span style="color: #339933;">/&gt;</span>
  <span style="color: #009900;">&#123;</span><span style="color: #339933;">&lt;</span>br <span style="color: #339933;">/&gt;</span>
  window.<span style="color: #660066;">localStorage</span>.<span style="color: #660066;">clear</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>    <span style="color: #339933;">&lt;</span>br <span style="color: #339933;">/&gt;</span>
  <span style="color: #009900;">&#125;</span><span style="color: #339933;">&lt;</span>br <span style="color: #339933;">/&gt;</span>
  <span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<h3>Manejando cambios</h3>
<p>La API  de almacenamiento local también incluye una forma de escuchar y responder a cambios en el almacenamiento local. Al agregar un event listener y escuchar un evento de storage, la aplicación puede responder a los cambios de localStorage. El dato en el evento incluye el nombre de la llave que cambio, el nuevo valor, el valor anterior (si es aplicable), y la URL de la página que llamó al API. La especificación para el API de localStorage esta implementada de tal manera que la sesión que inicializo el evento no verá la ejecución del evento. Eso es debido a que la especificación dice que el evento debería ser ejecutado únicamente por otras pestañas o sesiones y no en la que cambió el almacenamiento.</p>
<p>Para escuchar los eventos de almacenamiento, al primer paso es agregar el event listener:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;">window.<span style="color: #660066;">addEventListener</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;storage&quot;</span><span style="color: #339933;">,</span>onStorageChange<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Entonces se establece el evento de onStorageChange para manejar el evento de almacenamiento.</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #000066; font-weight: bold;">function</span> onStorageChange<span style="color: #009900;">&#40;</span>e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><span style="color: #339933;">&lt;</span>br <span style="color: #339933;">/&gt;</span>
  <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>e.<span style="color: #660066;">key</span> <span style="color: #339933;">==</span> <span style="color: #3366CC;">&quot;name&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">&lt;</span>br <span style="color: #339933;">/&gt;</span>
  <span style="color: #009900;">&#123;</span><span style="color: #339933;">&lt;</span>br <span style="color: #339933;">/&gt;</span>
  alert<span style="color: #009900;">&#40;</span>e.<span style="color: #660066;">newValue</span> <span style="color: #339933;">+</span> <span style="color: #3366CC;">' acaba de agregar su nombre al almacenamiento local'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>    <span style="color: #339933;">&lt;</span>br <span style="color: #339933;">/&gt;</span>
  <span style="color: #009900;">&#125;</span><span style="color: #339933;">&lt;</span>br <span style="color: #339933;">/&gt;</span>
  <span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Hay un API similar para crear datos que solamente persisten para la sesión individual. Al utilizar el objeto sessionStorage en vez de localStorage, cualquier dato almacenado será automáticamente eliminado cuando el usuario deje la pagina. De hecho, el API  tiene exactamente los mismos metodos, asi que se pueden utilizar al solo reemplazar localStorage con sessionStorage y los datos locales serán almacenados hasta que el usuario cierre el navegador o la pestaña en que se encuentre la aplicación.</p>
<h2>Almacenamiento Offline</h2>
<p>A veces simplificar unos cuantos datos en la máquina del usuario no será suficiente. En muchos casos, la aplicación completa puede tener que trabajar offline, no solo almacenar datos. Para ese caso de uso, HTML5 incluye la posibilidad de almacenar archivos y recursos en la máquina del usuario a los que el navegador podrá acceder sin una conexión a internet. Eso incluye imágenes, archivos JavaScript, archivos HTML, archivos CSS, casi cualquier cosa que conforme a la aplicación web puede ser almacenada localmente y utilizado incluso sin una conexión a internet. La clave de esto es configurar el manifiesto de almacenamiento.</p>
<h3>Utilizando un archivo manifiesto</h3>
<p>El archivo manifiesto es parte de un nuevo atributo manifest en la etiqueta raíz de HTML. Es un archivo en el servidor web que lista todos los archivos que el navegador debería descargar y guardar para que puedan ser utilizados después. Tiene la extensión .manifest y el único cambio que hay es que el servidor web debe tener soporte para el mime type .manifest, asegurate de que el servidor web que hospeda tu aplicación puede manejar archivos .manifest correctamente.</p>
<p>El archivo manifiesto tiene una estructura básica. Cada archivo manifiesto empieza con CACHE MANIFEST y ahí están listados todos los archivos que necesita el navegador para el acceso offline. Aquí hay un ejemplo sencillo que almacenará JavaScript, un archivo CSS, un par de imágenes, y la página HTML:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;">  CACHE MANIFEST<span style="color: #339933;">&lt;</span>br <span style="color: #339933;">/&gt;</span>
  style.<span style="color: #660066;">css</span><span style="color: #339933;">&lt;</span>br <span style="color: #339933;">/&gt;</span>
  offlinescript.<span style="color: #660066;">js</span><span style="color: #339933;">&lt;</span>br <span style="color: #339933;">/&gt;</span>
  images<span style="color: #339933;">/</span>dreamweaver_logo.<span style="color: #660066;">png</span><span style="color: #339933;">&lt;</span>br <span style="color: #339933;">/&gt;</span>
  images<span style="color: #339933;">/</span>edge_logo.<span style="color: #660066;">png</span></pre></td></tr></table></div>

<p>Las rutas son relativas a la página HTML a la cual accede el usuario. Hay otras opciones de las cuales se debe tener cuidado cuando se esta creando el manifiesto. El manifiesto del API ofrece una sección FALLBACK que apunta a una página que será cargada en el caso de uso anterior. Entonces cuando el usuario intente acceder a algo que no fue almacenado, verá un mensaje indicándole que se encuentra offline. Aqui hay un manifiesto de almacenamiento teórico que podría parecer así:</p>
<p>CACHE MANIFEST</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;">  NETWORK<span style="color: #339933;">:&lt;</span>br <span style="color: #339933;">/&gt;</span>
  my_dynamic_script.<span style="color: #660066;">cgi</span><span style="color: #339933;">&lt;</span>br <span style="color: #339933;">/&gt;</span>
  <span style="color: #339933;">&lt;</span>br <span style="color: #339933;">/&gt;</span>
  FALLBACK<span style="color: #339933;">:&lt;</span>br <span style="color: #339933;">/&gt;</span>
  my_offline_message.<span style="color: #660066;">html</span><span style="color: #339933;">&lt;</span>br <span style="color: #339933;">/&gt;</span>
  <span style="color: #339933;">&lt;</span>br <span style="color: #339933;">/&gt;</span>
  CACHE<span style="color: #339933;">:&lt;</span>br <span style="color: #339933;">/&gt;</span>
  style.<span style="color: #660066;">css</span><span style="color: #339933;">&lt;</span>br <span style="color: #339933;">/&gt;</span>
  offlinescript.<span style="color: #660066;">js</span><span style="color: #339933;">&lt;</span>br <span style="color: #339933;">/&gt;</span>
  images<span style="color: #339933;">/</span>dreamweaver_logo.<span style="color: #660066;">png</span><span style="color: #339933;">&lt;</span>br <span style="color: #339933;">/&gt;</span>
  images<span style="color: #339933;">/</span>edge_logo.<span style="color: #660066;">png</span></pre></td></tr></table></div>

<p>En este ejemplo, se tiene una página HTML con páginas externas de JavaScript y CSS. La página HTML muestra texto describiendo el logo de Adobe y cuando se le da click a la imagen, el JavaScript cambia la imagen y el texto por otro logo. Aqui esta el codigo HTML seguido de la función en JavaScript:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #339933;">&lt;!</span>DOCTYPE html PUBLIC <span style="color: #3366CC;">&quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot;</span> <span style="color: #3366CC;">&quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;</span><span style="color: #339933;">&gt;&lt;</span>br <span style="color: #339933;">/&gt;</span>
  <span style="color: #339933;">&lt;</span>html xmlns<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;http://www.w3.org/1999/xhtml&quot;</span> manifest<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;cache.manifest&quot;</span><span style="color: #339933;">&gt;&lt;</span>br <span style="color: #339933;">/&gt;</span>
  <span style="color: #339933;">&lt;</span>head<span style="color: #339933;">&gt;&lt;</span>br <span style="color: #339933;">/&gt;</span>
  <span style="color: #339933;">&lt;</span>meta http<span style="color: #339933;">-</span>equiv<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;Content-Type&quot;</span> content<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;text/html; charset=UTF-8&quot;</span> <span style="color: #339933;">/&gt;&lt;</span>br <span style="color: #339933;">/&gt;</span>
  <span style="color: #339933;">&lt;</span>title<span style="color: #339933;">&gt;</span>Adobe Logos<span style="color: #339933;">&lt;/</span>title<span style="color: #339933;">&gt;&lt;</span>br <span style="color: #339933;">/&gt;</span>
  <span style="color: #339933;">&lt;</span>script src<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;offlinescript.js&quot;</span><span style="color: #339933;">&gt;&lt;/</span>script<span style="color: #339933;">&gt;&lt;</span>br <span style="color: #339933;">/&gt;</span>
  <span style="color: #339933;">&lt;</span>link href<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;style.css&quot;</span> rel<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;stylesheet&quot;</span> <span style="color: #339933;">/&gt;&lt;</span>br <span style="color: #339933;">/&gt;</span>
  <span style="color: #339933;">&lt;/</span>head<span style="color: #339933;">&gt;&lt;</span>br <span style="color: #339933;">/&gt;</span>
  <span style="color: #339933;">&lt;</span>br <span style="color: #339933;">/&gt;</span>
  <span style="color: #339933;">&lt;</span>body<span style="color: #339933;">&gt;&lt;</span>br <span style="color: #339933;">/&gt;</span>
  <span style="color: #339933;">&lt;</span>div id<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;textContent&quot;</span><span style="color: #339933;">&gt;</span>Este es el logo de Edge<span style="color: #339933;">:&lt;/</span>div<span style="color: #339933;">&gt;&lt;</span>br <span style="color: #339933;">/&gt;&lt;</span>br <span style="color: #339933;">/&gt;</span>
  <span style="color: #339933;">&lt;</span>img id<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;logo&quot;</span> name<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;logo&quot;</span> src<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;images/edge_logo.png&quot;</span> onclick<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;onLogoClick();&quot;</span> <span style="color: #339933;">/&gt;&lt;</span>br <span style="color: #339933;">/&gt;</span>
  <span style="color: #339933;">&lt;</span>p <span style="color: #FF0000;">class</span><span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;small&quot;</span><span style="color: #339933;">&gt;</span>Click en el logo para cambiarlo.<span style="color: #339933;">&lt;/</span>p<span style="color: #339933;">&gt;&lt;</span>br <span style="color: #339933;">/&gt;</span>
  <span style="color: #339933;">&lt;/</span>body<span style="color: #339933;">&gt;&lt;</span>br <span style="color: #339933;">/&gt;</span>
  <span style="color: #339933;">&lt;/</span>html<span style="color: #339933;">&gt;&lt;</span>br <span style="color: #339933;">/&gt;</span>
  <span style="color: #339933;">&lt;</span>br <span style="color: #339933;">/&gt;</span>
  <span style="color: #006600; font-style: italic;">// JavaScript&lt;br /&gt;</span>
  <span style="color: #000066; font-weight: bold;">function</span> onLogoClick<span style="color: #009900;">&#40;</span>e<span style="color: #009900;">&#41;</span><span style="color: #339933;">&lt;</span>br <span style="color: #339933;">/&gt;</span>
  <span style="color: #009900;">&#123;</span><span style="color: #339933;">&lt;</span>br <span style="color: #339933;">/&gt;</span>
  <span style="color: #000066; font-weight: bold;">var</span> currentContent <span style="color: #339933;">=</span> window.<span style="color: #660066;">document</span>.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;textContent&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">innerHTML</span><span style="color: #339933;">;&lt;</span>br <span style="color: #339933;">/&gt;</span>
  <span style="color: #339933;">&lt;</span>br <span style="color: #339933;">/&gt;</span>
  <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>currentContent <span style="color: #339933;">==</span> <span style="color: #3366CC;">&quot;Este es el logo de Edge:&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">&lt;</span>br <span style="color: #339933;">/&gt;</span>
  <span style="color: #009900;">&#123;</span><span style="color: #339933;">&lt;</span>br <span style="color: #339933;">/&gt;</span>
  window.<span style="color: #660066;">document</span>.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;textContent&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">innerHTML</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;Este es el logo de Dreamweaver:&quot;</span><span style="color: #339933;">;&lt;</span>br <span style="color: #339933;">/&gt;</span>
  window.<span style="color: #660066;">document</span>.<span style="color: #660066;">logo</span>.<span style="color: #660066;">src</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;images/dreamweaver_logo.png&quot;</span><span style="color: #339933;">;</span> <span style="color: #339933;">&lt;</span>br <span style="color: #339933;">/&gt;</span>
  <span style="color: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span><span style="color: #339933;">&lt;</span>br <span style="color: #339933;">/&gt;</span>
  window.<span style="color: #660066;">document</span>.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;textContent&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">innerHTML</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;Este es el logo de Edge:&quot;</span><span style="color: #339933;">;&lt;</span>br <span style="color: #339933;">/&gt;</span>
  window.<span style="color: #660066;">document</span>.<span style="color: #660066;">logo</span>.<span style="color: #660066;">src</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;images/edge_logo.png&quot;</span><span style="color: #339933;">;</span> <span style="color: #339933;">&lt;</span>br <span style="color: #339933;">/&gt;</span>
  <span style="color: #009900;">&#125;</span><span style="color: #339933;">&lt;</span>br <span style="color: #339933;">/&gt;</span>
  <span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>La pieza clave para todo es la etiqueta de HTML con el atributo manifest. Esta apuntando al archivo cache.manifest. El archivo manifiesto instruye al navegador a descargar todos los archivos en esa lista. No importa si el usuario carga estos archivos mientras está navegando, el navegador descargará automáticamente todo en el archivo manifiesto. Eso significa que las imágenes serán almacenadas para su uso offline incluso cuando no se ha descargado la página (ya que aun no se ha interactuado con esta) en que están siendo utilizadas. Así que al cargar la página una vez, se puede interactuar completamente offline.</p>
<h3>Comprendiendo eventos</h3>
<p>La última parte importante del acceso offline son los eventos que ocurren durante el proceso de almacenamiento. Cuando el navegador encuentra el atributo manifest ejecuta una serie de eventos en el objeto window.applicationCache. Lo primero que ocurre es que se dispara el evento checking. Este evento busca lo que se debe hacer con este archivo de almacenamiento en particular. Las herramientas de desarrollo de Google Chrome proporcionan una gran vista de los eventos que ocurren cuando se lleva a cabo el almacenamiento.</p>
<p>Si es la primera vez que el usuario visita el sitio, el evento de descarga será ejecutado y el navegador descargará todos los recursos listados en el archivo manifiesto. Lee el archivo manifiesto, revisa cuantos archivos se tiene que descargar, y entonces devuelve una actualización del progreso de cada archivo. El evento de progreso incluye una variable descargada y una variable total, con la cual podemos determinar cuánto se ha almacenado.</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #000066; font-weight: bold;">function</span> onProgress<span style="color: #009900;">&#40;</span>e<span style="color: #009900;">&#41;</span><span style="color: #339933;">&lt;</span>br <span style="color: #339933;">/&gt;</span>
  <span style="color: #009900;">&#123;</span><span style="color: #339933;">&lt;</span>br <span style="color: #339933;">/&gt;</span>
  <span style="color: #000066; font-weight: bold;">var</span> content <span style="color: #339933;">=</span> window.<span style="color: #660066;">document</span>.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;loadedInfo&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">innerHTML</span><span style="color: #339933;">;&lt;</span>br <span style="color: #339933;">/&gt;</span>
  window.<span style="color: #660066;">document</span>.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;loadedInfo&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">innerHTML</span> <span style="color: #339933;">=</span> content <span style="color: #339933;">+</span> <span style="color: #3366CC;">'&lt;br /&gt; Loaded file '</span> <span style="color: #339933;">+</span> e.<span style="color: #660066;">loaded</span> <span style="color: #339933;">+</span> <span style="color: #3366CC;">' of '</span> <span style="color: #339933;">+</span> e.<span style="color: #660066;">total</span><span style="color: #339933;">;&lt;</span>br <span style="color: #339933;">/&gt;</span>
  <span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Una vez que todo ha sido almacenado, el navegador dispara un evento de almacenamiento para notificar al desarrollador que todos los archivos han sido descargados satisfactoriamente.</p>
<p>Las siguientes ocasiones que el usuario visite la página, el navegador revisa si algo ha cambiado en el archivo manifiesto. Si nada ha cambiado, ejecuta el evento noupdate y continua. Si algo ha cambiado, realiza el mismo proceso descrito anteriormente; ejecutará el evento downloading con una serie de eventos de progreso hasta que los archivos hayan sido actualizados. Cuando eso ocurre, en vez de ejecutar el evento cached, el navegador disparará un evento updateready para avisar que los archivos han sido actualizados.</p>
<p>El último evento del cual preocuparse es el evento error que se ejecutará cada vez que algo falle. Puede ser que un archivo no se haya descargado correctamente, que el navegador no pueda acceder al archivo manifiesto, o que uno o más archivos listados no están disponibles. Para identificarlo, simplemente se agrega un event listener para este evento.</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;">window.<span style="color: #660066;">applicationCache</span>.<span style="color: #660066;">addEventListener</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;error&quot;</span><span style="color: #339933;">,</span>onError<span style="color: #009900;">&#41;</span><span style="color: #339933;">;&lt;</span>br <span style="color: #339933;">/&gt;</span>
  <span style="color: #339933;">&lt;</span>br <span style="color: #339933;">/&gt;</span>
  <span style="color: #000066; font-weight: bold;">function</span> onError<span style="color: #009900;">&#40;</span>e<span style="color: #009900;">&#41;</span><span style="color: #339933;">&lt;</span>br <span style="color: #339933;">/&gt;</span>
  <span style="color: #009900;">&#123;</span><span style="color: #339933;">&lt;</span>br <span style="color: #339933;">/&gt;</span>
  window.<span style="color: #660066;">document</span>.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;loadedInfo&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">innerHTML</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;Algo salió mal mientras se guardaban los archivos.&quot;</span><span style="color: #339933;">;&lt;</span>br <span style="color: #339933;">/&gt;</span>
  <span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<h2>Base de datos web</h2>
<p>Originalmente había una <a href="http://www.w3.org/TR/webdatabase/">especificación de SQL Web</a> que ya no recibe mantenimiento. Ahora esa energía es enfocada al trabajo de un API de Base de Datos indexada y parece que esta será la forma de almacenar información en bases de datos relacionales. Firefox y Chrome soportan indexedDB pero debido a la especificación y al soporte aún están en curso, eso está más allá del enfoque de este artículo. </p>
<h2>A dónde ir desde aquí</h2>
<p>En este artículo exploramos dos de las principales formas para almacenar datos localmente. La primera proporciona un almacenamiento básico. Con esta API se pueden guardar nombres de valores pares más allá de las sesiones o una simple sesión. La segunda, la aplicación del archivo manifiesto, que permite a los desarrolladores almacenar archivos completos en la máquina del usuario para su uso offline.</p>
<p>Para más información de las APIs de HTML5 de almacenamiento, revisa los siguientes recursos:</p>
<p><a href="http://diveintohtml5.org/storage.html">El pasado, el presente y el futuro del almacenamiento local para aplicaciones web</a></p>
<p><a href="http://www.html5rocks.com/en/features/storage">HTML5 Rocks: Almacenamiento Local</a></p>
<p><a href="http://drdobbs.com/web-development/225702544">Dr. Dobbs: Almacenamiento Web para HTML5</a></p>
<p>La documentación: <a href="http://dev.w3.org/html5/webstorage/">Borrador de la W3C: Almacenamiento Web</a></p>
<p>La versión original de este artículo está publicada en <a href="http://www.adobe.com/devnet/html5/articles/html5-storage-apis.html">Adobe Devnet</a> bajo licencia Creative Commons, fue traducido y adaptado en nuestro blog por <a href="https://twitter.com/jesus_macedo">Jesús Macedo</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://activ.com.mx/un-vistazo-a-localstorage-en-html5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Categorías de Valores en JavaScript</title>
		<link>http://activ.com.mx/categorias-de-valores-en-javascript/</link>
		<comments>http://activ.com.mx/categorias-de-valores-en-javascript/#comments</comments>
		<pubDate>Wed, 28 Nov 2012 07:49:35 +0000</pubDate>
		<dc:creator>jesus_macedo</dc:creator>
				<category><![CDATA[Activ]]></category>
		<category><![CDATA[Articulos]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[articulos]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[tutoriales]]></category>

		<guid isPermaLink="false">http://activ.com.mx/?p=5074</guid>
		<description><![CDATA[En este artículo, explicaré qué tipos de valores tiene JavaScript y como se puede categorizarlos. Eso te ayudará a comprender mejor cómo funciona el lenguaje. Además te ayudará con tareas de programación avanzadas, como crear una librería, donde a veces tienes que tratar con todo tipo de valores siendo recibidos. Con el conocimiento obtenido aquí, [...]]]></description>
				<content:encoded><![CDATA[<p>En este artículo, explicaré qué tipos de valores tiene JavaScript y como se puede categorizarlos. Eso te ayudará a comprender mejor cómo funciona el lenguaje. Además te ayudará con tareas de programación avanzadas, como crear una librería, donde a veces tienes que tratar con todo tipo de valores siendo recibidos. Con el conocimiento obtenido aquí, serás capaz de evitar errores provocados por diferencias sutiles entre los valores.</p>
<p style="text-align:center"><img src="http://activ.com.mx/wp-content/uploads/2012/11/javascript_dw.jpg" alt="JavaScript" title="JavaScript" width="370" height="211" class="aligncenter size-full wp-image-5130" /></p>
<p>Te mostraré cuatro formas en que se pueden categorizar los valores: a través de la propiedad oculta [[Class]], a través del operador typeof, a través del operador instanceof, y a través de la función Array.isArray(). También te explicare los objetos prototipo de constructores incorporados, los cuales producen resultados inesperados de categorización.</p>
<p><span id="more-5074"></span></p>
<h2>Revisando lo básico</h2>
<p>Antes de comenzar con el tema, necesitamos revisar algunos conocimientos necesarios.</p>
<h3>Primitivos contra objetos</h3>
<p>Todos los valores en JavaScript o son primitivos o son objetos.</p>
<p>Primitivos: los siguientes valores son primitivos.</p>
<ul>
<li>undefined</li>
<li>null</li>
<li>Boolean</li>
<li>Number</li>
<li>String</li>
</ul>
<p>Los primitivos son inmutables; no se les puede agregar propiedades:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #000066; font-weight: bold;">var</span> str <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;abc&quot;</span><span style="color: #339933;">;</span>
str.<span style="color: #660066;">foo</span> <span style="color: #339933;">=</span> <span style="color: #CC0000;">123</span><span style="color: #339933;">;</span>  <span style="color: #006600; font-style: italic;">// intenta agregar la propiedad &quot;foo&quot;&lt;br&gt;</span>
<span style="color: #CC0000;">123</span>
str.<span style="color: #660066;">foo</span>  <span style="color: #006600; font-style: italic;">// sin cambio</span>
<span style="color: #003366; font-weight: bold;">undefined</span></pre></td></tr></table></div>

<p>Además, los primitivos son comparados por valor, lo cual significa que son considerados igual si tienen el mismo contenido:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #339933;">&gt;</span> <span style="color: #3366CC;">&quot;abc&quot;</span> <span style="color: #339933;">===</span> <span style="color: #3366CC;">&quot;abc&quot;</span>
<span style="color: #003366; font-weight: bold;">true</span></pre></td></tr></table></div>

<p>Objetos: todos los valores no-primitivos son objetos. Los objetos son mutables.</p>
<pre>
var obj = {};
obj.foo = 123;  // intenta agregar la propiedad "foo"
123
obj.foo  // la propiedad "foo" ha sido agregada
123
</pre>
<p>Los objetos son comparados por referencia. Cada objeto tiene su propia identidad y, debido a esto dos objetos son considerados iguales únicamente si son, de hecho, el mismo objeto:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span> <span style="color: #339933;">===</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span>
<span style="color: #003366; font-weight: bold;">false</span>
<span style="color: #000066; font-weight: bold;">var</span> obj <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
obj <span style="color: #339933;">===</span> obj
<span style="color: #003366; font-weight: bold;">true</span></pre></td></tr></table></div>

<h3>Envolviendo tipos de objetos</h3>
<p>Los tipos primitivos boolean, number y string tienen el contenedor de tipo de objeto correspondiente: Boolean, Number y String. Las instancias de estos tipos son objetos y son diferentes de los primitivos a los que contienen.</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #000066; font-weight: bold;">typeof</span> <span style="color: #000066; font-weight: bold;">new</span> <span style="">String</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;abc&quot;</span><span style="color: #009900;">&#41;</span>
<span style="color: #339933;">&gt;</span> <span style="color: #3366CC;">'object'</span>
<span style="color: #339933;">&gt;</span> <span style="color: #000066; font-weight: bold;">typeof</span> <span style="color: #3366CC;">&quot;abc&quot;</span><span style="color: #339933;">&lt;</span>br<span style="color: #339933;">&gt;</span>
<span style="color: #3366CC;">'string'</span>
<span style="color: #339933;">&gt;</span> <span style="color: #000066; font-weight: bold;">new</span> <span style="">String</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;abc&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">===</span> <span style="color: #3366CC;">&quot;abc&quot;</span>
<span style="color: #003366; font-weight: bold;">false</span></pre></td></tr></table></div>

<p>Los contenedores de tipos de objetos son raramente utilizados de manera directa, pero sus objetos prototipo definen los métodos de los primitivos. Por ejemplo, String.prototype es el objeto prototipo del contenedor para el tipo String. Todos sus métodos también están disponibles para string. Tomemos el método contenedor String.prototype.indexOf. Los string primitivos tienen el mismo método, no un método diferente con el mismo nombre, literalmente es el mismo método:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #339933;">&gt;</span> <span style="">String</span>.<span style="color: #000066; font-weight: bold;">prototype</span>.<span style="color: #660066;">indexOf</span> <span style="color: #339933;">===</span> <span style="color: #3366CC;">&quot;&quot;</span>.<span style="color: #660066;">indexOf</span>
<span style="color: #003366; font-weight: bold;">true</span></pre></td></tr></table></div>

<h3>Propiedades internas</h3>
<p>Las <a href="http://ecma-international.org/ecma-262/5.1/#sec-8.6.2">propiedades internas</a> son aquellas a las cuales no se puede acceder directamente desde JavaScript, pero si afectan como trabaja. Los nombres de las propiedades inician con una letra mayúscula y están escritas en dobles corchetes. Por ejemplo, [[Extensible]] es una propiedad interna que mantiene un aviso booleano que determina si una propiedad puede o no ser agregada a un objeto. Su valor solamente puede ser manipulado de manera indirecta. Object.isExtensible() revisa su valor, mientras que Object.preventExtentions() establece su valor a false. Una vez que su valor es false, no hay forma de cambiarlo a true.</p>
<h3>Terminología: prototipos contra objetos prototipo</h3>
<p>En JavaScript, el término prototipo esta por desgracia un poco sobrecargado.</p>
<p>1. Por otra parte, está el prototipo de relación entre objetos. Cada objeto tiene una propiedad oculta [[Prototype]] que bien, o apunta a su prototipo o es null. El prototipo es una continuación del objeto. Varios objetos pueden tener el mismo prototipo.</p>
<p>2. Además, si, por ejemplo, se implementa un tipo para un constructor Foo, ese constructor tendrá entonces una propiedad Foo.prototype que mantendrá al tipo objeto prototipo.</p>
<p>Para hacer la diferencia clara, los desarrolladores los llaman (1) &ldquo;prototipos&rdquo; y (2) &ldquo;objetos prototipo&rdquo;. Hay tres métodos que ayudan al tratar con prototipos:</p>
<ul>
<li>Object.getPrototypeOf(obj) retorna el prototipo del objeto:</li>
</ul>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #339933;">&gt;</span> <span style="">Object</span>.<span style="color: #660066;">getPrototypeOf</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">===</span> <span style="">Object</span>.<span style="color: #000066; font-weight: bold;">prototype</span>
<span style="color: #003366; font-weight: bold;">true</span></pre></td></tr></table></div>

<ul>
<li>Object.create(proto) crea un objeto vacío cuyo prototipo es proto:</li>
</ul>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #339933;">&gt;</span> <span style="">Object</span>.<span style="color: #660066;">create</span><span style="color: #009900;">&#40;</span><span style="">Object</span>.<span style="color: #000066; font-weight: bold;">prototype</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Object.create() puede hacer <a href="https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/create">más</a>, pero está más allá del objetivo de este artículo.</p>
<ul>
<li>proto.isPrototypeOf(obj) retorna true si proto es un prototipo de obj (o un prototipo de un prototipo, y así):</li>
</ul>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #339933;">&gt;</span> <span style="">Object</span>.<span style="color: #000066; font-weight: bold;">prototype</span>.<span style="color: #660066;">isPrototypeOf</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span>
<span style="color: #003366; font-weight: bold;">true</span></pre></td></tr></table></div>

<h3>La propiedad &ldquo;constructor&rdquo;</h3>
<p>Dado un constructor de la función Foo, el objeto prototipo Foo.prototype tiene una propiedad Foo.prototype.constructor que se remite a Foo. Esa propiedad se establece automáticamente para cada función.</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #339933;">&gt;</span> <span style="color: #000066; font-weight: bold;">function</span> Foo<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #009900;">&#125;</span>
  <span style="color: #339933;">&gt;</span> Foo.<span style="color: #000066; font-weight: bold;">prototype</span>.<span style="color: #660066;">constructor</span> <span style="color: #339933;">===</span> Foo
  <span style="color: #003366; font-weight: bold;">true</span>
  <span style="color: #339933;">&gt;</span> RegExp.<span style="color: #000066; font-weight: bold;">prototype</span>.<span style="color: #660066;">constructor</span> <span style="color: #339933;">===</span> RegExp
  <span style="color: #003366; font-weight: bold;">true</span></pre></td></tr></table></div>

<p>Todas las instancias de un constructor heredan esa propiedad del objeto prototipo. Por lo tanto, la puedes usar para determinar qué constructor creó una instancia:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #339933;">&gt;</span> <span style="color: #000066; font-weight: bold;">new</span> Foo<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">constructor</span>
  <span style="color: #009900;">&#91;</span><span style="">Function</span><span style="color: #339933;">:</span> Foo<span style="color: #009900;">&#93;</span>
  <span style="color: #339933;">&gt;</span> <span style="color: #009966; font-style: italic;">/abc/</span>.<span style="color: #660066;">constructor</span>
  <span style="color: #009900;">&#91;</span><span style="">Function</span><span style="color: #339933;">:</span> RegExp<span style="color: #009900;">&#93;</span></pre></td></tr></table></div>

<h2>Categorizando valores</h2>
<p>Hay cuatro formas de categorizar valores:</p>
<ul>
<li>[[Class]] es una propiedad interna con una cadena que clasifica un objeto.</li>
<li>typeof es un operador que categoriza primitivos y ayuda a distinguirlos de los objetos.</li>
<li>instanceof es un operador que categoriza objetos.</li>
<li>Array.isArray() es una función que determina si un valor es un arreglo.</li>
</ul>
<p>[[Class]]</p>
<p>Es una propiedad interna cuyo valor es uno de las siguientes cadenas:</p>
<p>&#8220;Arguments&#8221;, &#8220;Array&#8221;, &#8220;Boolean&#8221;, &#8220;Date&#8221;, &#8220;Error&#8221;, &#8220;Function&#8221;, &#8220;JSON&#8221;, &#8220;Math&#8221;, &#8220;Number&#8221;, &#8220;Object&#8221;, &#8220;RegExp&#8221;, &#8220;String&#8221;</p>
<p>La única forma de acceder a esta desde JavaScript es a través del método predeterminado toString(), el cual puede ser invocado generalmente de esta forma:</p>
<p>Object.prototype.toString.call(value)</p>
<p>Tal invocación devuelve:</p>
<ul>
<li>&ldquo;[object Undefined]&rdquo; si el valor es indefinido.</li>
<li>&ldquo;[object Null]&rdquo; si el valor es nulo.</li>
<li>&ldquo;[object &ldquo; + value.[[Class]] + &ldquo;]&rdquo; si el valor es un objeto.</li>
<li>&ldquo;[object &ldquo; + value.[[Class]] + &ldquo;]&rdquo; si el valor es un primitivo (es convertido a un objeto y manejado como en la regla anterior).</li>
</ul>
<p>Ejemplos:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #339933;">&gt;</span> <span style="">Object</span>.<span style="color: #000066; font-weight: bold;">prototype</span>.<span style="color: #660066;">toString</span>.<span style="color: #660066;">call</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">undefined</span><span style="color: #009900;">&#41;</span>
  <span style="color: #3366CC;">'[object Undefined]'</span>
  <span style="color: #339933;">&gt;</span> <span style="">Object</span>.<span style="color: #000066; font-weight: bold;">prototype</span>.<span style="color: #660066;">toString</span>.<span style="color: #660066;">call</span><span style="color: #009900;">&#40;</span><span style="">Math</span><span style="color: #009900;">&#41;</span>
  <span style="color: #3366CC;">'[object Math]'</span>
  <span style="color: #339933;">&gt;</span> <span style="">Object</span>.<span style="color: #000066; font-weight: bold;">prototype</span>.<span style="color: #660066;">toString</span>.<span style="color: #660066;">call</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span>
  <span style="color: #3366CC;">'[object Object]'</span></pre></td></tr></table></div>

<p>Por lo tanto, la siguiente función puede ser utilizada para recuperar el [[Class]] de un valor x:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #339933;">&lt;</span>p<span style="color: #339933;">&gt;</span><span style="color: #000066; font-weight: bold;">function</span> getClass<span style="color: #009900;">&#40;</span>x<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #000066; font-weight: bold;">var</span> str <span style="color: #339933;">=</span> <span style="">Object</span>.<span style="color: #000066; font-weight: bold;">prototype</span>.<span style="color: #660066;">toString</span>.<span style="color: #660066;">call</span><span style="color: #009900;">&#40;</span>x<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #009966; font-style: italic;">/^\[object (.*)\]$/</span>.<span style="color: #660066;">exec</span><span style="color: #009900;">&#40;</span>str<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Esta función en acción:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;">getClass<span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span>
  <span style="color: #3366CC;">'Null'</span>
  <span style="color: #339933;">&gt;</span> getClass<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span>
  <span style="color: #3366CC;">'Object'</span>
  <span style="color: #339933;">&gt;</span> getClass<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span>
  <span style="color: #3366CC;">'Array'</span>
  <span style="color: #339933;">&gt;</span> getClass<span style="color: #009900;">&#40;</span>JSON<span style="color: #009900;">&#41;</span>
  <span style="color: #3366CC;">'JSON'</span>
  <span style="color: #339933;">&gt;</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #000066; font-weight: bold;">return</span> getClass<span style="color: #009900;">&#40;</span>arguments<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
  <span style="color: #3366CC;">'Arguments'</span>
  <span style="color: #339933;">&gt;</span> <span style="color: #000066; font-weight: bold;">function</span> Foo<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span>
  <span style="color: #339933;">&gt;</span> getClass<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">new</span> Foo<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
  <span style="color: #3366CC;">'Object'</span></pre></td></tr></table></div>

<p>typeof</p>
<p>Categoriza primitivos y permite distinguir entre primitivos y objetos usando la siguiente sintaxis:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #000066; font-weight: bold;">typeof</span> valor</pre></td></tr></table></div>

<p>Devuelve una de las siguientes cadenas, dependiendo del operando:</p>
<div>
<table>
<tbody>
<tr>
<td width="165">Operando</td>
<td width="165">Resultado</td>
</tr>
<tr>
<td>undefined</td>
<td>&#8220;undefined&#8221;</td>
</tr>
<tr>
<td>null</td>
<td>&#8220;object&#8221;</td>
</tr>
<tr>
<td>Boolean value</td>
<td>&#8220;boolean&#8221;</td>
</tr>
<tr>
<td>Number value</td>
<td>&#8220;number&#8221;</td>
</tr>
<tr>
<td>String value</td>
<td>&#8220;string&#8221;</td>
</tr>
<tr>
<td>Function</td>
<td>&#8220;function&#8221;</td>
</tr>
<tr>
<td>Todos los demás valores</td>
<td>&#8220;object&#8221;</td>
</tr>
</tbody>
</table>
</div>
<p>El operador typeof retorna &ldquo;object&rdquo; para null, esto debido a un bug en JavaScript. Desafortunadamente, este error no tiene solución, debido a que &ldquo;rompería&rdquo; el código existente. Observa que mientras que una función también es un objeto, typeof hace una distinción. Los arreglos, por otra parte, son considerados objetos. Estas peculiaridades hacen complicado el revisar si un valor es un objeto:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #000066; font-weight: bold;">function</span> isObject<span style="color: #009900;">&#40;</span>x<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #000066; font-weight: bold;">return</span> x <span style="color: #339933;">!==</span> <span style="color: #003366; font-weight: bold;">null</span> <span style="color: #339933;">&amp;&amp;</span>
  <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">typeof</span> x <span style="color: #339933;">===</span> <span style="color: #3366CC;">'object'</span> <span style="color: #339933;">||</span> <span style="color: #000066; font-weight: bold;">typeof</span> x <span style="color: #339933;">===</span> <span style="color: #3366CC;">'function'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>instanceof</p>
<p>Revisa si un valor es una instancia de algún tipo, con esta sintaxis:</p>
<p>valor instanceof Tipo</p>
<p>El operador revisa Type.prototype para ver si se encuentra en la cadena prototipo de valor. Eso es, si estuvieras implementando instanceof, debería lucir algo como esto (menos algunos errores, como el tipo null):</p>
<pre>
<p>function myInstanceof(value, Type) {<br />
  return Type.prototype.isPrototypeOf(value);<br />
  }</p>
</pre>
<p>instanceof siempre devuelve false para los valores primitivos:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #339933;">&gt;</span> <span style="color: #3366CC;">&quot;&quot;</span> <span style="color: #000066; font-weight: bold;">instanceof</span> <span style="">String</span>
  <span style="color: #003366; font-weight: bold;">false</span>
  <span style="color: #339933;">&gt;</span> <span style="color: #3366CC;">&quot;&quot;</span> <span style="color: #000066; font-weight: bold;">instanceof</span> <span style="">Object</span>
  <span style="color: #003366; font-weight: bold;">false</span></pre></td></tr></table></div>

<p>Array.isArray()</p>
<p>Existe debido a un problema en particular en los navegadores: cada frame tiene su propio ambiente global. Por ejemplo: dado un frame A y un frame B (donde cualquiera de ellos puede ser el documento), el código en A puede pasar un valor al código de B. El código en B no puede usar instanceof Array para revisar si el valor es un arreglo, debido a que el Array en B es diferente del que hay en A. Por ejemplo:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #339933;">&lt;</span>html<span style="color: #339933;">&gt;</span>
<span style="color: #339933;">&lt;</span>head<span style="color: #339933;">&gt;</span>
<span style="color: #339933;">&lt;</span>script<span style="color: #339933;">&gt;</span>
<span style="color: #006600; font-style: italic;">// test() es llamado desde el iframe</span>
<span style="color: #000066; font-weight: bold;">function</span> test<span style="color: #009900;">&#40;</span>arr<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #000066; font-weight: bold;">var</span> iframeWin <span style="color: #339933;">=</span> frames<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
  console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span>arr <span style="color: #000066; font-weight: bold;">instanceof</span> <span style="">Array</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// false</span>
  console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span>arr <span style="color: #000066; font-weight: bold;">instanceof</span> iframeWin.<span style="">Array</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// true</span>
  console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span><span style="">Array</span>.<span style="color: #660066;">isArray</span><span style="color: #009900;">&#40;</span>arr<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// true</span>
  <span style="color: #009900;">&#125;</span>
  <span style="color: #339933;">&lt;/</span>script<span style="color: #339933;">&gt;</span>
  <span style="color: #339933;">&lt;/</span>head<span style="color: #339933;">&gt;</span>
  <span style="color: #339933;">&lt;</span>body<span style="color: #339933;">&gt;</span>
  <span style="color: #339933;">&lt;</span>iframe<span style="color: #339933;">&gt;&lt;/</span>iframe<span style="color: #339933;">&gt;</span>
  <span style="color: #339933;">&lt;</span>script<span style="color: #339933;">&gt;</span>
  <span style="color: #006600; font-style: italic;">// Llena el iframe</span>
  <span style="color: #000066; font-weight: bold;">var</span> iframeWin <span style="color: #339933;">=</span> frames<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
  iframeWin.<span style="color: #660066;">document</span>.<span style="color: #660066;">write</span><span style="color: #009900;">&#40;</span>
  <span style="color: #3366CC;">'&lt;script&gt;window.parent.test([])&lt;/'</span><span style="color: #339933;">+</span><span style="color: #3366CC;">'script&gt;'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #339933;">&lt;/</span>script<span style="color: #339933;">&gt;</span>
  <span style="color: #339933;">&lt;/</span>body<span style="color: #339933;">&gt;</span>
  <span style="color: #339933;">&lt;/</span>html<span style="color: #339933;">&gt;</span></pre></td></tr></table></div>

<p>Por lo tanto, ECMAScript 5 introdujo Array.isArray(), el cual usa [[Class]] para determinar si un valor es un arreglo. No obstante, el problema descrito arriba en el ejemplo de los frames, existe para todos los tipos cuando se utiliza en conjunto con instanceof.</p>
<h2>Objetos prototipo incorporados</h2>
<p>Los objetos prototipo del tipo incorporado son valores extraños: se comportan como instancias de los tipos, pero cuando son examinados a través de instanceof, no son instancias. Algunos resultados de categorización para objetos prototipo también son inesperados. Para intentar comprender lo que sucede, puedes profundizar tu comprendimiento de categorización.</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="">Object</span>.<span style="color: #000066; font-weight: bold;">prototype</span></pre></td></tr></table></div>

<p>Es un objeto vacío. Es impreso como uno y no tiene propiedades propias:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #339933;">&gt;</span> <span style="">Object</span>.<span style="color: #000066; font-weight: bold;">prototype</span>
  <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span>
  <span style="color: #339933;">&gt;</span> <span style="">Object</span>.<span style="color: #660066;">keys</span><span style="color: #009900;">&#40;</span><span style="">Object</span>.<span style="color: #000066; font-weight: bold;">prototype</span><span style="color: #009900;">&#41;</span>
  <span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span></pre></td></tr></table></div>

<p>Unexpected. Object.prototype es un objeto, pero no es una instancia de Object. Por un lado, ambos typeof y [[Class]] lo reconocen como un objeto:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #339933;">&gt;</span> getClass<span style="color: #009900;">&#40;</span><span style="">Object</span>.<span style="color: #000066; font-weight: bold;">prototype</span><span style="color: #009900;">&#41;</span>
  <span style="color: #3366CC;">'Object'</span>
  <span style="color: #339933;">&gt;</span> <span style="color: #000066; font-weight: bold;">typeof</span> <span style="">Object</span>.<span style="color: #000066; font-weight: bold;">prototype</span>
  <span style="color: #3366CC;">'object'</span></pre></td></tr></table></div>

<p>Por otra parte, instanceof no lo considera una instancia de Object.</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #339933;">&gt;</span> <span style="">Object</span>.<span style="color: #000066; font-weight: bold;">prototype</span> <span style="color: #000066; font-weight: bold;">instanceof</span> <span style="">Object</span>
  <span style="color: #003366; font-weight: bold;">false</span></pre></td></tr></table></div>

<p>Para que el resultado de arriba sea true, Object.prototype tendría que estar en su propia cadena prototipo, provocando un ciclo que empiece y termine con Object.prototype.La cadena prototipo ya no sería linear, lo cual no es algo que queramos para una estructura de datos que tiene que ser fácil de atravesar, Por lo tanto, Object.prototype no tiene un prototipo. Es el único objeto incorporado que no tiene uno.</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #339933;">&gt;</span> <span style="">Object</span>.<span style="color: #660066;">getPrototypeOf</span><span style="color: #009900;">&#40;</span><span style="">Object</span>.<span style="color: #000066; font-weight: bold;">prototype</span><span style="color: #009900;">&#41;</span>
  <span style="color: #003366; font-weight: bold;">null</span></pre></td></tr></table></div>

<p>Este tipo de paradoja mantiene true para todos los objetos incorporados: ya que son considerados instancias de sus tipos por todos los mecanismos, excepto instanceof.</p>
<p>Expected. [[Class]], typeof e instanceof coinciden en la mayoría de los demás objetos:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #339933;">&gt;</span> getClass<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span>
  <span style="color: #3366CC;">'Object'</span>
  <span style="color: #339933;">&gt;</span> <span style="color: #000066; font-weight: bold;">typeof</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span>
  <span style="color: #3366CC;">'object'</span>
  <span style="color: #339933;">&gt;</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">instanceof</span> <span style="">Object</span>
  <span style="color: #003366; font-weight: bold;">true</span></pre></td></tr></table></div>

<p>Function.prototype</p>
<p>En sí misma es una función. Acepta cualquier argumento y retorna indefinido:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #339933;">&gt;</span> <span style="">Function</span>.<span style="color: #000066; font-weight: bold;">prototype</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;a&quot;</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">&quot;b&quot;</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">1</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">2</span><span style="color: #009900;">&#41;</span>
  <span style="color: #003366; font-weight: bold;">undefined</span></pre></td></tr></table></div>

<p>Unexpected. Function.prototype es una función, pero no una instancia de Function: Por un lado, typeof, el cual revisa si un método [[Call]] interno está presente, dice que Function.prototype es una función:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #339933;">&gt;</span> <span style="color: #000066; font-weight: bold;">typeof</span> <span style="">Function</span>.<span style="color: #000066; font-weight: bold;">prototype</span>
  <span style="color: #3366CC;">'function'</span></pre></td></tr></table></div>

<p>La propiedad [[Class]] dice lo mismo:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #339933;">&gt;</span> getClass<span style="color: #009900;">&#40;</span><span style="">Function</span>.<span style="color: #000066; font-weight: bold;">prototype</span><span style="color: #009900;">&#41;</span>
  <span style="color: #3366CC;">'Function'</span></pre></td></tr></table></div>

<p>Por otra parte, instanceof dice que Function.prototype no es una instancia de Function:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #339933;">&gt;</span> <span style="">Function</span>.<span style="color: #000066; font-weight: bold;">prototype</span> <span style="color: #000066; font-weight: bold;">instanceof</span> <span style="">Function</span>
  <span style="color: #003366; font-weight: bold;">false</span></pre></td></tr></table></div>

<p>Esto debido a que no tiene a Function.prototype en su cadena prototipo. En su lugar, su prototipo es Object.prototype:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #339933;">&gt;</span> <span style="">Object</span>.<span style="color: #660066;">getPrototypeOf</span><span style="color: #009900;">&#40;</span><span style="">Function</span>.<span style="color: #000066; font-weight: bold;">prototype</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">===</span> <span style="">Object</span>.<span style="color: #000066; font-weight: bold;">prototype</span>
  <span style="color: #003366; font-weight: bold;">true</span></pre></td></tr></table></div>

<p>Expected. Con todas las demás funciones, no hay sorpresas:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #339933;">&gt;</span> <span style="color: #000066; font-weight: bold;">typeof</span> <span style="color: #000066; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span>
  <span style="color: #3366CC;">'function'</span>
  <span style="color: #339933;">&gt;</span> getClass<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span>
  <span style="color: #3366CC;">'Function'</span>
  <span style="color: #339933;">&gt;</span> <span style="color: #000066; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">instanceof</span> <span style="">Function</span>
  <span style="color: #003366; font-weight: bold;">true</span></pre></td></tr></table></div>

<p>Function siempre es considerado una función en cada caso:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #339933;">&gt;</span> <span style="color: #000066; font-weight: bold;">typeof</span> <span style="">Function</span>
  <span style="color: #3366CC;">'function'</span>
  <span style="color: #339933;">&gt;</span> getClass<span style="color: #009900;">&#40;</span><span style="">Function</span><span style="color: #009900;">&#41;</span>
  <span style="color: #3366CC;">'Function'</span>
  <span style="color: #339933;">&gt;</span> <span style="">Function</span> <span style="color: #000066; font-weight: bold;">instanceof</span> <span style="">Function</span>
  <span style="color: #003366; font-weight: bold;">true</span></pre></td></tr></table></div>

<p>Array.prototype</p>
<p>Es un arreglo vacío. Es visualizado de forma que tiene una longitud de 0.</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #339933;">&gt;</span> <span style="">Array</span>.<span style="color: #000066; font-weight: bold;">prototype</span>
  <span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span>
  <span style="color: #339933;">&gt;</span> <span style="">Array</span>.<span style="color: #000066; font-weight: bold;">prototype</span>.<span style="color: #660066;">length</span>
  <span style="color: #CC0000;">0</span></pre></td></tr></table></div>

<p>[[Class]] también lo considera un arreglo:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #339933;">&gt;</span> getClass<span style="color: #009900;">&#40;</span><span style="">Array</span>.<span style="color: #000066; font-weight: bold;">prototype</span><span style="color: #009900;">&#41;</span>
  <span style="color: #3366CC;">'Array'</span></pre></td></tr></table></div>

<p>También lo hace Array.isArray(), el cual está basado en [[Class]]:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #339933;">&gt;</span> <span style="">Array</span>.<span style="color: #660066;">isArray</span><span style="color: #009900;">&#40;</span><span style="">Array</span>.<span style="color: #000066; font-weight: bold;">prototype</span><span style="color: #009900;">&#41;</span>
  <span style="color: #003366; font-weight: bold;">true</span></pre></td></tr></table></div>

<p>Naturalmente, instanceof no lo hace:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #339933;">&gt;</span> <span style="">Array</span>.<span style="color: #000066; font-weight: bold;">prototype</span> <span style="color: #000066; font-weight: bold;">instanceof</span> <span style="">Array</span>
  <span style="color: #003366; font-weight: bold;">false</span></pre></td></tr></table></div>

<p>Así que para no ser redundante, no mencionare que los objetos prototipo no son instancias de su tipo.</p>
<p>RegExp.prototype</p>
<p>Es una expresión regular que iguala todo:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #339933;">&gt;</span> RegExp.<span style="color: #000066; font-weight: bold;">prototype</span>.<span style="color: #660066;">test</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;abc&quot;</span><span style="color: #009900;">&#41;</span>
  <span style="color: #003366; font-weight: bold;">true</span>
  <span style="color: #339933;">&gt;</span> RegExp.<span style="color: #000066; font-weight: bold;">prototype</span>.<span style="color: #660066;">test</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;&quot;</span><span style="color: #009900;">&#41;</span>
  <span style="color: #003366; font-weight: bold;">true</span></pre></td></tr></table></div>

<p>RegExp.prototype también es aceptada para <a href="http://ecma-international.org/ecma-262/5.1/#sec-15.5.4.10">String.prototype.match</a>, el cual revisa si su argumento es una expresión regular a través de [[Class]]. Que revisa si es positivo para ambos, expresiones regulares y objetos prototipo.</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #339933;">&gt;</span> getClass<span style="color: #009900;">&#40;</span><span style="color: #009966; font-style: italic;">/abc/</span><span style="color: #009900;">&#41;</span>
  <span style="color: #3366CC;">'RegExp'</span>
  <span style="color: #339933;">&gt;</span> getClass<span style="color: #009900;">&#40;</span>RegExp.<span style="color: #000066; font-weight: bold;">prototype</span><span style="color: #009900;">&#41;</span>
  <span style="color: #3366CC;">'RegExp'</span></pre></td></tr></table></div>

<p>Excursion: la expresión regular vacía. RegExp.prototype es equivalente para la &ldquo;expresión regular vacía&rdquo;. Esa expresión es creada en cualquiera de las dos formas:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #339933;">&lt;</span>p<span style="color: #339933;">&gt;</span><span style="color: #000066; font-weight: bold;">new</span> RegExp<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;&quot;</span><span style="color: #009900;">&#41;</span>  <span style="color: #006600; font-style: italic;">// constructor</span>
  <span style="color: #009966; font-style: italic;">/(?:)/</span>          <span style="color: #006600; font-style: italic;">// literal</span></pre></td></tr></table></div>

<p>No deberías usar el constructor de RegExp si estas creando una expresión regular de manera dinámica. Expresar una expresión regular vacía literalmente es complicado por el hecho de que no puedes utilizar / /, lo cual comenzaría un comentario. El grupo vacío no capturado (?:) se comporta igual que la expresión regular vacía: iguala todo y no crea capturas en una igualdad:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #339933;">&gt;</span> <span style="color: #000066; font-weight: bold;">new</span> RegExp<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">exec</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;abc&quot;</span><span style="color: #009900;">&#41;</span>
  <span style="color: #009900;">&#91;</span> <span style="color: #3366CC;">''</span><span style="color: #339933;">,</span> index<span style="color: #339933;">:</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">,</span> input<span style="color: #339933;">:</span> <span style="color: #3366CC;">'abc'</span> <span style="color: #009900;">&#93;</span>
  <span style="color: #339933;">&gt;</span> <span style="color: #009966; font-style: italic;">/(?:)/</span>.<span style="color: #660066;">exec</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;abc&quot;</span><span style="color: #009900;">&#41;</span>
  <span style="color: #009900;">&#91;</span> <span style="color: #3366CC;">''</span><span style="color: #339933;">,</span> index<span style="color: #339933;">:</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">,</span> input<span style="color: #339933;">:</span> <span style="color: #3366CC;">'abc'</span> <span style="color: #009900;">&#93;</span></pre></td></tr></table></div>

<p>Un grupo vacío que no mantiene una igualdad completa en el índice 0, pero también captura (primero) ese grupo en índice 1:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #339933;">&gt;</span> <span style="color: #009966; font-style: italic;">/()/</span>.<span style="color: #660066;">exec</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;abc&quot;</span><span style="color: #009900;">&#41;</span>
  <span style="color: #009900;">&#91;</span> <span style="color: #3366CC;">''</span><span style="color: #339933;">,</span>  <span style="color: #006600; font-style: italic;">// indice 0</span>
  <span style="color: #3366CC;">''</span><span style="color: #339933;">,</span>  <span style="color: #006600; font-style: italic;">// indice 1</span>
  index<span style="color: #339933;">:</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">,</span>
  input<span style="color: #339933;">:</span> <span style="color: #3366CC;">'abc'</span> <span style="color: #009900;">&#93;</span></pre></td></tr></table></div>

<p>Curiosamente, ambos una expresión regular vacía creada a través del constructor y RegExp.prototype son visualizadas como el vacío literal:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #339933;">&gt;</span> <span style="color: #000066; font-weight: bold;">new</span> RegExp<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;&quot;</span><span style="color: #009900;">&#41;</span>
  <span style="color: #009966; font-style: italic;">/(?:)/</span>
  <span style="color: #339933;">&gt;</span> RegExp.<span style="color: #000066; font-weight: bold;">prototype</span>
  <span style="color: #009966; font-style: italic;">/(?:)/</span>
<span style="">Date</span>.<span style="color: #000066; font-weight: bold;">prototype</span></pre></td></tr></table></div>

<p>También es una fecha:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #339933;">&gt;</span> getClass<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">new</span> <span style="">Date</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
  <span style="color: #3366CC;">'Date'</span>
  <span style="color: #339933;">&gt;</span> getClass<span style="color: #009900;">&#40;</span><span style="">Date</span>.<span style="color: #000066; font-weight: bold;">prototype</span><span style="color: #009900;">&#41;</span>
  <span style="color: #3366CC;">'Date'</span></pre></td></tr></table></div>

<p>Las fechas contienen números. Citando a la <a href="http://ecma-international.org/ecma-262/5.1/#sec-15.9.1.1">especificación de ECMAScript 5.1</a>:</p>
<p>Un objeto Date contiene un número que indica un instante de tiempo (en milisegundos) en particular. Como un número es llamado un valor de tiempo. Un valor de tiempo también puede ser un NaN, que indique que el objeto Date no representa un instante de tiempo específico.</p>
<p>En ECMAScript el tiempo se mide en milisegundos desde 01 Enero, 1970 UTC.</p>
<p>Hay dos maneras de acceder al valor de tiempo al llamar valueOf, o al convertir una fecha a un número:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #339933;">&gt;</span> <span style="color: #000066; font-weight: bold;">var</span> d <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">new</span> <span style="">Date</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// ahora</span>
  <span style="color: #339933;">&gt;</span> d.<span style="color: #660066;">valueOf</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
  <span style="color: #CC0000;">1347035199049</span>
  <span style="color: #339933;">&gt;</span> <span style="">Number</span><span style="color: #009900;">&#40;</span>d<span style="color: #009900;">&#41;</span>
  <span style="color: #CC0000;">1347035199049</span></pre></td></tr></table></div>

<p>El valor de tiempo de Date.prototype es NaN:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #339933;">&gt;</span> <span style="">Date</span>.<span style="color: #000066; font-weight: bold;">prototype</span>.<span style="color: #660066;">valueOf</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
  <span style="color: #003366; font-weight: bold;">NaN</span>
  <span style="color: #339933;">&gt;</span> <span style="">Number</span><span style="color: #009900;">&#40;</span><span style="">Date</span>.<span style="color: #000066; font-weight: bold;">prototype</span><span style="color: #009900;">&#41;</span>
  <span style="color: #003366; font-weight: bold;">NaN</span></pre></td></tr></table></div>

<p>Date.prototype es visualizado como una fecha inválida, al igual que las fechas que han sido creadas a través de NaN:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #339933;">&gt;</span> <span style="">Date</span>.<span style="color: #000066; font-weight: bold;">prototype</span>
  Invalid <span style="">Date</span>
  <span style="color: #339933;">&gt;</span> <span style="color: #000066; font-weight: bold;">new</span> <span style="">Date</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">NaN</span><span style="color: #009900;">&#41;</span>
  Invalid Date<span style="color: #339933;">&lt;/</span>p<span style="color: #339933;">&gt;</span></pre></td></tr></table></div>

<p>Number.prototype</p>
<p>Es muy parecido a new Number (0):</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #339933;">&gt;</span> <span style="">Number</span>.<span style="color: #000066; font-weight: bold;">prototype</span>.<span style="color: #660066;">valueOf</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
  <span style="color: #CC0000;">0</span></pre></td></tr></table></div>

<p>La conversión a número retorna el valor primitivo envuelto:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #339933;">&gt;</span> <span style="color: #339933;">+</span><span style="">Number</span>.<span style="color: #000066; font-weight: bold;">prototype</span>
  <span style="color: #CC0000;">0</span></pre></td></tr></table></div>

<p>Comparado a:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #339933;">&gt;</span> <span style="color: #339933;">+</span><span style="color: #000066; font-weight: bold;">new</span> <span style="">Number</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#41;</span>
  <span style="color: #CC0000;">0</span></pre></td></tr></table></div>

<p>String.prototype</p>
<p>Es muy parecida a new String(&ldquo;&rdquo;):</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #339933;">&gt;</span> <span style="">String</span>.<span style="color: #000066; font-weight: bold;">prototype</span>.<span style="color: #660066;">valueOf</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
  <span style="color: #3366CC;">''</span></pre></td></tr></table></div>

<p>La conversión a cadena retorna el valor primitivo envuelto:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #339933;">&gt;</span> <span style="color: #3366CC;">&quot;&quot;</span> <span style="color: #339933;">+</span> <span style="">String</span>.<span style="color: #000066; font-weight: bold;">prototype</span>
  <span style="color: #3366CC;">''</span></pre></td></tr></table></div>

<p>Comparado a:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #339933;">&gt;</span> <span style="color: #3366CC;">&quot;&quot;</span> <span style="color: #339933;">+</span> <span style="color: #000066; font-weight: bold;">new</span> <span style="">String</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;&quot;</span><span style="color: #009900;">&#41;</span>
  <span style="color: #3366CC;">''</span></pre></td></tr></table></div>

<p>Boolean.prototype</p>
<p>Es muy parecido a new Boolean(false):</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #339933;">&gt;</span> <span style="">Boolean</span>.<span style="color: #000066; font-weight: bold;">prototype</span>.<span style="color: #660066;">valueOf</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
  <span style="color: #003366; font-weight: bold;">false</span></pre></td></tr></table></div>

<p>Los objetos booleanos pueden ser convertidos a valores booleanos primitivos, pero el resultado de esa conversión siempre es true, debido a que convertir cualquier objeto a boolean siempre será true:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #339933;">&gt;</span> <span style="color: #339933;">!!</span><span style="">Boolean</span>.<span style="color: #000066; font-weight: bold;">prototype</span>
  <span style="color: #003366; font-weight: bold;">true</span>
  <span style="color: #339933;">&gt;</span> <span style="color: #339933;">!!</span><span style="color: #000066; font-weight: bold;">new</span> <span style="">Boolean</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span>
  <span style="color: #003366; font-weight: bold;">true</span>
  <span style="color: #339933;">&gt;</span> <span style="color: #339933;">!!</span><span style="color: #000066; font-weight: bold;">new</span> <span style="">Boolean</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span>
  <span style="color: #003366; font-weight: bold;">true</span></pre></td></tr></table></div>

<p>Eso es diferente dado que los objetos son convertidos a números o cadenas. Si un objeto contiene estos primitivos, el resultado de una conversión es el primitivo envuelto.</p>
<h2>Recomendaciones</h2>
<p>Estas son recomendaciones para categorizar mejor los valores en JavaScript.</p>
<p>Tratar los objetos prototipo como miembros principales de sus tipos</p>
<p>Un objeto primitivo siempre será un miembro principal de un tipo? No, eso solo es válido para los tipos incorporados. En general, el comportamiento de los objetos prototipos es meramente una curiosidad. Es mejor pensar en ellos como <a href="http://www.2ality.com/2011/06/prototypes-as-classes.html">análogos a clases</a>: contienen propiedades compartidas por todas las instancias  (usualmente métodos).</p>
<p>Que mecanismo de categorización usar</p>
<p>Cuando se decide qué mecanismo de categorización usar, se tiene que distinguir entre código normal y código que podría trabajar con valores de otros frames.</p>
<p>Código normal. Para código normal, usa typeof e instanceof (olvídate de [[Class]] y Array.isArray()). Se debe ser consciente de las peculiaridades de typeof: null es considerado un &ldquo;object&rdquo; y tiene dos categorías no primitivas, &ldquo;object&rdquo; y &ldquo;function&rdquo;. Por ejemplo, una función que determine si un valor es un objeto podría implementarse de esta forma:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #000066; font-weight: bold;">function</span> isObject<span style="color: #009900;">&#40;</span>v<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">typeof</span> v <span style="color: #339933;">===</span> <span style="color: #3366CC;">&quot;object&quot;</span> <span style="color: #339933;">&amp;&amp;</span> v <span style="color: #339933;">!==</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span>
  <span style="color: #339933;">||</span> <span style="color: #000066; font-weight: bold;">typeof</span> v <span style="color: #339933;">===</span> <span style="color: #3366CC;">&quot;function&quot;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Implementar este método luciria asi:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #339933;">&gt;</span> isObject<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span>
  <span style="color: #003366; font-weight: bold;">true</span>
  <span style="color: #339933;">&gt;</span> isObject<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span>
  <span style="color: #003366; font-weight: bold;">true</span>
  <span style="color: #339933;">&gt;</span> isObject<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;&quot;</span><span style="color: #009900;">&#41;</span>
  <span style="color: #003366; font-weight: bold;">false</span>
  <span style="color: #339933;">&gt;</span> isObject<span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">undefined</span><span style="color: #009900;">&#41;</span>
  <span style="color: #003366; font-weight: bold;">false</span></pre></td></tr></table></div>

<p>Código que funciona con valores de otros frames. Si se espera recibir valores de otros frames, instanceof no es confiable. Se debe considerar [[Class]] y Array.isArray(). Una alternativa es trabajar con el nombre del constructor del objeto, pero esa es una solución frágil ya que no todos los objetos registran su constructor, no todos los constructores tienen nombre, y hay riesgo de &ldquo;choques&rdquo; de nombres. La siguiente función muestra cómo recibir el nombre del constructor de un objeto.</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #000066; font-weight: bold;">function</span> getConstructorName<span style="color: #009900;">&#40;</span>obj<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>obj.<span style="color: #660066;">constructor</span> <span style="color: #339933;">&amp;&amp;</span> obj.<span style="color: #660066;">constructor</span>.<span style="color: #660066;">name</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #000066; font-weight: bold;">return</span> obj.<span style="color: #660066;">constructor</span>.<span style="color: #660066;">name</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #3366CC;">&quot;&quot;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
  <span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Otra cosa que vale la pena destacar es que la propiedad nombre de funciones (como obj.constructor) no es estándar y, por ejemplo, no son soportados por Internet Explorer. Intenta:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #339933;">&gt;</span> getConstructorName<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span>
  <span style="color: #3366CC;">'Object'</span>
  <span style="color: #339933;">&gt;</span> getConstructorName<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span>
  <span style="color: #3366CC;">'Array'</span>
  <span style="color: #339933;">&gt;</span> getConstructorName<span style="color: #009900;">&#40;</span><span style="color: #009966; font-style: italic;">/abc/</span><span style="color: #009900;">&#41;</span>
  <span style="color: #3366CC;">'RegExp'</span>
  <span style="color: #339933;">&gt;</span> <span style="color: #000066; font-weight: bold;">function</span> Foo<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span>
  <span style="color: #339933;">&gt;</span> getConstructorName<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">new</span> Foo<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
  <span style="color: #3366CC;">'Foo'</span></pre></td></tr></table></div>

<p>Si se aplica getConstructorName() a un valor primitivo, se obtendrá el nombre asociado al tipo de contenedor:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #339933;">&gt;</span> getConstructorName<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;&quot;</span><span style="color: #009900;">&#41;</span>
  <span style="color: #3366CC;">'String'</span></pre></td></tr></table></div>

<p>Esto es debido a que el valor primitivo obtiene la propiedad constructor del tipo de contenedor:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #339933;">&gt;</span> <span style="color: #3366CC;">&quot;&quot;</span>.<span style="color: #660066;">constructor</span> <span style="color: #339933;">===</span> <span style="">String</span>.<span style="color: #000066; font-weight: bold;">prototype</span>.<span style="color: #660066;">constructor</span>
  <span style="color: #003366; font-weight: bold;">true</span></pre></td></tr></table></div>

<h2>A donde ir desde aquí</h2>
<p>En este artículo, has aprendido cómo categorizar valores en JavaScript. Desafortunadamente se necesita conocimiento detallado para realizar esta tarea apropiadamente, como las primeras dos categorizaciones: typeof e insteadof (cada uno con sus particularidades). El artículo incluye recomendaciones para trabajar con estas.</p>
<p>Como siguiente paso, puedes aprender más acerca de herencia en JavaScript. Los siguientes blogs te ayudarán a comenzar:</p>
<p><a href="http://www.2ality.com/2011/06/prototypes-as-classes.html">Prototipos como clases -una introducción a la herencia en JavaScript</a></p>
<p><a href="http://www.2ality.com/2012/01/js-inheritance-by-example.html">Herencia en JavaScript por ejemplo</a></p>
<p><a href="http://www.2ality.com/2012/02/exemplars.html">Patrones ejemplares en JavaScript</a></p>
<p><a href="http://www.2ality.com/2012/03/private-data.html">Datos privados para objetos en JavaScript</a></p>
<p>La versión original de este artículo está publicada en <a href="http://www.adobe.com/devnet/html5/articles/categorizing-values-in-javascript.html">Adobe Devnet</a> bajo licencia Creative Commons, fue traducido y adaptado en nuestro blog por <a href="https://twitter.com/jesus_macedo">Jesús Macedo</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://activ.com.mx/categorias-de-valores-en-javascript/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JavaScript para principiantes</title>
		<link>http://activ.com.mx/javascript-para-principiantes/</link>
		<comments>http://activ.com.mx/javascript-para-principiantes/#comments</comments>
		<pubDate>Mon, 26 Nov 2012 18:27:56 +0000</pubDate>
		<dc:creator>gr_maggi</dc:creator>
				<category><![CDATA[Articulos]]></category>
		<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[articulos]]></category>
		<category><![CDATA[ejemplos]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[tutoriales]]></category>

		<guid isPermaLink="false">http://activ.com.mx/?p=5059</guid>
		<description><![CDATA[JavaScript es un simple, poderoso y popular lenguaje de programación que está integrado en los navegadores web. Aprender JavaScript es especialmente útil si eres diseñador web y ya sabes HTML y CSS, porque es usado para hacer páginas web interactivas. Sin embargo, JavaScript no está limitado a hacer páginas web interactivas; puedes también usarlo para [...]]]></description>
				<content:encoded><![CDATA[<p>JavaScript es un simple, poderoso y popular lenguaje de programación que está integrado en los navegadores web. Aprender JavaScript es especialmente útil si eres diseñador web y ya sabes HTML y CSS, porque es usado para hacer páginas web interactivas. Sin embargo, JavaScript no está limitado a hacer páginas web interactivas; puedes también usarlo para programación del lado del servidor utilizando un framework como Node.js.</p>
<p style="text-align:center"><img src="http://activ.com.mx/wp-content/uploads/2012/11/class-header-performance.jpg" alt="JavaScript" title="JavaScript" width="360" height="270" class="aligncenter size-full wp-image-5118" /></p>
<p>En este tutorial aprenderás algunos conceptos básicos de JavaScript, incluyendo dos conceptos de programación básica -cálculos y variables-. Si quieres aprender a hacer sitios web interactivos. Usando JavaScript, necesitas aprender los conceptos centrales de la programación. Usando HTML y JavaScript, puedes cambiar el contenido de elementos HTML en respuesta a eventos del usuario, como hacer clic en un botón.<br />
<span id="more-5059"></span></p>
<h2>Escribir un simple programa de Hola Mundo con JavaScript</h2>
<p>Los programas con JavaScript son una secuencia de declaraciones o comandos que son ejecutados por un navegador en el orden que fueron escritos. El programa más simple de JavaScript puede ser de una sola línea, mientras que los grandes programas pueden ser de miles de líneas. La tradición de la programación es que el primer programa que aprendes es uno que muestra el mensaje: Hello World. El código siguiente es un ejemplo de un programa JavaScript de Hello World envuelto en unas pocas líneas de código HTML, que permiten que funcione en un navegador web como una página web válida:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #339933;">&lt;!</span>doctype html<span style="color: #339933;">&gt;</span>
&nbsp;
<span style="color: #339933;">&lt;</span>title<span style="color: #339933;">&gt;</span>JavaScript Test<span style="color: #339933;">&lt;/</span>title<span style="color: #339933;">&gt;</span>
&nbsp;
<span style="color: #339933;">&lt;</span>script<span style="color: #339933;">&gt;</span>
&nbsp;
alert<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'Hello World!'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #339933;">&lt;/</span>script<span style="color: #339933;">&gt;</span></pre></td></tr></table></div>

<p>En el ejemplo de arriba, el código JavaScript es el que está entre el &lt;script&gt; y &lt;/script&gt;. Esta línea contiene un comando alert de JavaScript que indica al navegador web que muestre un mensaje que contiene el texto entre las comillas. Observa que en JavaScript, las comillas alrededor del mensaje pueden ser simples o dobles, ambas son igual.</p>
<p>Si estás familiarizado con HTML, puedes estar preguntándote por qué el ejemplo no contiene etiquetas &lt;html&gt;, &lt;head&gt; y &lt;body&gt;. En realidad, estas etiquetas son opcionales en HTML4 y HTML5. Los ejemplos de este tutorial siguen la <a href="http://google-styleguide.googlecode.com/svn/trunk/htmlcssguide.xml">Guía de estilo de Google, </a>que recomienda dejar fuera las etiquetas opcionales.</p>
<p>Para ejecutar este programa, sigue estos pasos:</p>
<ol>
<li>Copia las cinco líneas de código y pégalas en un editor de texto (como Dreamweaver o  Notepad)</li>
<li>Guarda el archivo como test.html</li>
<li>Abre el archivo usando tu navegador favorito</li>
<li>Un mensaje que dice Hello World! aparece en cuanto se carga la página</li>
<li>Si lo deseas, puedes editar test.html para cambiar el mensaje que aparece en la caja de mensaje, luego guarda el código y haz clic en F5 mientras tu navegador está activo para actualizar la página.</li>
</ol>
<p>Observa que la declaración de alert se termina con un punto y coma. En JavaScript, el punto y coma es opcional -a diferencia de lenguajes de programación como C y Java-. Sin embargo, ya que hay pocos casos donde no poner punto y coma causa problemas, se recomienda ponerlo después de cada comando.</p>
<p>Otra forma de escribir el programa Hello World es mostrar texto directamente en nuestra página web. Puedes hacerlo utilizando el siguiente código:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #339933;">&lt;!</span>doctype html<span style="color: #339933;">&gt;</span>
&nbsp;
<span style="color: #339933;">&lt;</span>title<span style="color: #339933;">&gt;</span>JavaScript Test<span style="color: #339933;">&lt;/</span>title<span style="color: #339933;">&gt;</span>
&nbsp;
<span style="color: #339933;">&lt;</span>script<span style="color: #339933;">&gt;</span>
&nbsp;
document.<span style="color: #660066;">body</span>.<span style="color: #660066;">innerHTML</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">'Hello World'</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #339933;">&lt;/</span>script<span style="color: #339933;">&gt;</span></pre></td></tr></table></div>

<p>Cuando esta página web cargue, el navegador primero mostrará el texto: Hello Activ. Después, el navegador instantáneamente ejecutará la línea de JavaScript entre las etiquetas script, que reemplazan el texto con la frase: Hello World. Esto sucede rápidamente, el cambio no es aún visible para el usuario. Esto funciona por qué document.body.innerHTML es un poco de código especial de JavaScript que accede a los contenidos de la página web entera. Utilizando document.body.innerHTML = &#8216;Hello World&#8217; se establece el contenido de la página web para Hello World. Esto puede parecer confuso al principio, pero una vez que comprendas los conceptos básicos de JavaScript comenzará a tomar sentido.</p>
<h2>Realización de cálculos</h2>
<p>Calcular valores en JavaScript es similar a calcular sumas en una aplicación de hoja de cálculo como Microsoft Excel. Por ejemplo, el símbolo * representa la multiplicación como en JavaScript y Excel. Sin embargo, hay algunas diferencias. Por ejemplo, en Excel 2^4 significa 2 a la potencia de 4, lo que equivale a 16. En JavaScript, ^ significa exclusivamente OR, pero eso es un tema para un tutorial más avanzado.</p>
<p>Todas las reglas de matemáticas regulares sobre orden de funcionamiento y uso de paréntesis también se aplican en JavaScript. Así, por ejemplo, cálculos de multiplicación (*) o división (/) ocurren antes de la suma (+) y resta (-). El siguiente ejemplo de código JavaScript muestra el resultado de un cálculo simple en una caja de alerta:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;">alert<span style="color: #009900;">&#40;</span><span style="color: #CC0000;">32</span> <span style="color: #339933;">+</span> <span style="color: #CC0000;">9</span> <span style="color: #339933;">*</span> <span style="color: #CC0000;">1.8</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>El cálculo de arriba convierte la temperatura actual en Nueva Zelanda de Celsius a Fahrenheit  y muestra la respuesta en una caja de alerta. Si quieres más detalles de cálculos en JavaScript, revisa las <a href="http://codeavengers.com/javascript#2">lecciones 2-5 de Los Vengadores del Código</a>.</p>
<p>En común práctica, es inusual realizar cálculos JavaScript con números fijos. Generalmente hablando, es más probable que uses cálculos JavaScript basado en valores ingresados por el visitante del sitio web. En la siguiente sección se mostrará cómo hacerlo.</p>
<h2>Trabajando con variables</h2>
<p>Una forma para que puedas obtener la entrada de datos de un visitante en el sitio implica el uso del comando prompt de JavaScript. Por ejemplo, podrías utilizar esta línea de código:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;">prompt<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'What is the temperature in Celcius?'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>El código anterior muestra una caja de diálogo, que visualiza una pregunta. La caja de diálogo contiene un campo de texto para que el visitante ingrese su respuesta, junto con un botón de aceptar y cancelar. Para ver lo que aparece en la caja de diálogo, pega el código dentro de las etiquetas de script de la página HTML de la sección anterior y ejecuta el código en tu navegador.</p>
<p>Las cajas se muestran con los comandos prompt y alert. Estas se muestran de forma diferente en cada navegador. Como resultado, generalmente sólo sirven al probar programas JavaScript. Mostrar cajas alert estilizadas requiere mucho código HTML, CSS y JavaScript. Afortunadamente, los desarrolladores web ya han creado cajas alert y han publicado en línea su código para que puedas utilizarlo gratis! Si quieres ver algunos ejemplos, consulta la <a href="http://jqueryui.com/">página Interfaz de Usuario</a> en el sitio de JQuery UI. Usar esta herramienta requiere un poco de conocimiento de JavaScript para implementar las cajas de diálogo en tus propios proyectos, pero es un gran recurso.</p>
<h3>Creando variables</h3>
<p>En la sección anterior aprendiste como hacer una pregunta a un usuario, pero ¿cómo vas a almacenar y a usar su respuesta? Es donde entran las variables. Las variables son marcadores de posición utilizadas para almacenar información que se recibe y después se modifica en un programa. Por ejemplo, en las siguientes líneas de código se crea una variable llamada temperatura y se le asigna un valor numérico 12:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #000066; font-weight: bold;">var</span> temperature <span style="color: #339933;">=</span> <span style="color: #CC0000;">12</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>La línea de código para crear una variable comienza con var (que es la abreviatura de variable). Esto es seguido por el nombre de la variable, a continuación el símbolo =, seguido por el valor a almacenar. En matemáticas = significa que dos cosas tienen el mismo valor, como 4*3=2*6=12. En programación JavaScript, el signo igual significa que el valor es asignado. Si lees la línea de código anterior en Español regular, dirías: Crea una variable denominada temperatura y asígnale el valor de 12.</p>
<p>Para almacenar una respuesta que un visitante ingresa en una caja de diálogo, puedes usar el siguiente código:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #000066; font-weight: bold;">var</span> temperature <span style="color: #339933;">=</span> prompt<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'What is the temperature in celcius?'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
alert<span style="color: #009900;">&#40;</span><span style="color: #CC0000;">32</span> <span style="color: #339933;">+</span> temperature <span style="color: #339933;">*</span> <span style="color: #CC0000;">27</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Este código muestra una caja de diálogo con la pregunta. Donde el visitante ingresa una respuesta y da clic en OK, la respuesta es almacenada en la variable de temperatura Fahrenheit. La siguiente línea de código utiliza la variable para calcular el equivalente de la temperatura y mostrar el valor en una caja alert.</p>
<p>Nota: Si el visitante da clic en el botón de Cancel, un valor especial llamado null es almacenado en la variable. Para saber más acerca de valores null, revisa la <a href="http://codeavengers.com/javascript#17">lección 17 de Vengadores del Código.</a></p>
<h2>Variables Constantes</h2>
<p>JavaScript no solo utiliza variables para almacenar un dato ingresado por el usuario. También emplea variables para almacenar valores constantes que nunca cambian. El siguiente código de ejemplo utiliza una variable constante (nombrada en mayúsculas):</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #000066; font-weight: bold;">var</span> KILOS_TO_POUNDS <span style="color: #339933;">=</span> <span style="color: #CC0000;">2.2</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000066; font-weight: bold;">var</span> weight <span style="color: #339933;">=</span> prompt<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'What is your weight in kilos?'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
alert<span style="color: #009900;">&#40;</span>POUNDS_TO_KILOS <span style="color: #339933;">*</span> weight<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>En el ejemplo de arriba, la primera línea crea una variable constante que almacena el número de libras en un kilogramo. La siguiente línea solicita al usuario que ingrese su peso y almacena el valor en la variable nombrada weight. La línea final calcula el peso en libras, y entonces muestra el resultado del cálculo en una caja alert.</p>
<p>Observa que la variable que almacena el número de libras en un kilogramo utiliza letras mayúsculas. Cuando escribes JavaScript, no es necesario que nombres las variables con letras mayúsculas, pero la recomendación. Cuando veas variables nombradas todas en mayúsculas, puedes decir a simple vista que el valor almacenado en la variable es constante y no va a cambiar.</p>
<p>Las variables constantes hacen el código JavaScript más fácil de leer. Mientras que solamente podrías escribir 2.2, lo cual requiere que escribas menos, los nombres que asignes a las variables constantes harán que tu código sea más fácil de entender. Por ejemplo, si lees el código alert(4+12*27); es improbable saber que se está calculando. Sin embargo, el siguiente código hace la función más obvia:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #000066; font-weight: bold;">var</span> MONTHS_IN_YEAR <span style="color: #339933;">=</span> <span style="color: #CC0000;">12</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000066; font-weight: bold;">var</span> myAgeInYears <span style="color: #339933;">=</span> <span style="color: #CC0000;">27</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000066; font-weight: bold;">var</span> monthsSinceMyLastBirthday <span style="color: #339933;">=</span> <span style="color: #CC0000;">4</span><span style="color: #339933;">;</span>
&nbsp;
alert<span style="color: #009900;">&#40;</span>monthsSinceBirthday <span style="color: #339933;">+</span> myAgeInYears <span style="color: #339933;">*</span> MONTHS_IN_YEAR<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>El código del ejemplo de arriba calcula el número de meses desde tu nacimiento.</p>
<p>Nota: Aprender acerca de otras razones para usar variables, consulta la <a href="http://codeavengers.com/javascript#5">lección 5 de Vengadores del Código</a>.</p>
<h2>Variables String</h2>
<p>Las variables no solo están diseñadas para almacenar números. Las variables también pueden almacenar secuencia de caracteres, que en la programación son llamadas string. Una variable que almacena texto es llamada variable string. En código JavaScript, una secuencia de caracteres dentro de comillas se nombra string.</p>
<p>La siguiente línea de código crea una variable string llamada name y se le asigna el texto Mike.</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #000066; font-weight: bold;">var</span> name <span style="color: #339933;">=</span> <span style="color: #3366CC;">'Mike'</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>El siguiente código solicita al visitante ingresar su nombre y entonces muestra un mensaje que lo saluda por su nombre:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #000066; font-weight: bold;">var</span> name <span style="color: #339933;">=</span> prompt<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'What is your name?'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
alert<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'Hello '</span> <span style="color: #339933;">+</span> name <span style="color: #339933;">+</span> <span style="color: #3366CC;">', nice to meet you'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>En JavaScript el símbolo de mas (+) tiene dos usos. Cuando se utiliza con números literales y variables numéricas se agregan los números, así 2+4 es 6. Pero cuando el símbolo mas (+) se utiliza con strings, se unen entre sí, como este: &#8216;Code&#8217; + &#8216;Avengers&#8217; es &#8216;CodeAvengers&#8217;.</p>
<h3>Combinando cálculos con strings</h3>
<p>Simplemente mostrando la respuesta a un cálculo en una caja alert no es muy útil. Es más útil mostrar también el texto que explica el número al visitante. En el siguiente código de ejemplo se entiende mejor como mostrar una cadena de texto:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #000066; font-weight: bold;">var</span> KILOS_TO_POUNDS <span style="color: #339933;">=</span> <span style="color: #CC0000;">2.2</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000066; font-weight: bold;">var</span> weight <span style="color: #339933;">=</span> prompt<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'What is your weight in kilos?'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
alert<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'Your weight in pounds is '</span> <span style="color: #339933;">+</span> POUNDS_TO_KILOS <span style="color: #339933;">*</span> weight<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Las primeras dos líneas en este código son igual a las anteriores. En esta versión, se incluye un string antes del cálculo en la tercera línea. Cuando ejecutas este código e ingresas el peso (73) aparecerá la caja alert y mostrará la declaración: Su peso en libras es 160.6.</p>
<p>Cuando revisas la tercera línea, recuerda que la multiplicación (*) siempre se calcula antes de la suma (+) en JavaScript. En este ejemplo, el navegador primero calcula POUNDS_TO_KILOS*weight, que en mi caso es 160.6. Luego se une la respuesta con el string para crear la frase ‘Your weight in pounds is 160.6’ y muestras el texto en una caja alert.</p>
<p>Otro punto importante a considerar es que la variable weight en la segunda línea realmente almacena un string y no un número. El dato ingresado por el usuario en la caja de diálogo siempre será almacenado como un string. En este ejemplo, el cálculo funciona de todas maneras, porque cuando el símbolo de multiplicación (*) es usado entre un string y un número (u otro string), automáticamente el string se convierte en un número. Así que &#8217;12&#8242; * 5 ó &#8217;12&#8242; * &#8217;5&#8242; ó 12 * 5 evaluará al número 60. Si ejecutas la línea: &#8216;blah&#8217; * 5 y &#8216;Five&#8217; * 5, ambos cálculos fallan y el resultado sería un valor especial JavaScript llamado NaN, que significa: no es un número.</p>
<p>Las cosas funcionan un poco diferente con el símbolo de suma (+). Si un signo de mas (+) es usado con un número y un string, ellos se unen entre sí, independientemente de si o no se puede convertir el string en un número. Así que &#8217;12&#8242; + 5 ó &#8217;12&#8242; + &#8217;5&#8242; ó &#8217;12&#8242; + 5 proporcionará todo el resultado del string &#8217;125&#8242;. Cuando escribes código JavaScript, asegurate de tener en cuenta este comportamiento.</p>
<p>Nota: Para obtener una mejor comprensión de agregar strings y números,  sigue el código de la <a href="http://codeavengers.com/javascript#9">lección 9 de los Vengadores del Código.</a></p>
<h2>Cambiando el color de fondo basado en el dato que ingresa el usuario</h2>
<p>En esta sección, aprenderás cómo usar mensajes y variables para cambiar el color de fondo de una página web. El siguiente código de ejemplo crea una página web con dos botones. Si el visitante da clic en el botón Change Color, aparece una caja de diálogo que solicita al visitante ingresar un color de fondo. Después de que el visitante ingresa un color da clic en OK, el color de fondo de la página web es actualizado. Si el visitante da clic en el botón Undo Color, el color de fondo de la página cambia al color anterior. Intenta ejecutar el código siguiente en un navegador para probar los botones.</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #339933;">&lt;!</span>doctype<span style="color: #339933;">&gt;</span>
&nbsp;
<span style="color: #339933;">&lt;</span>script<span style="color: #339933;">&gt;</span>
&nbsp;
<span style="color: #000066; font-weight: bold;">var</span> oldColor <span style="color: #339933;">=</span> <span style="color: #3366CC;">'black'</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000066; font-weight: bold;">function</span> changeColor<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
oldColor <span style="color: #339933;">=</span> document.<span style="color: #660066;">body</span>.<span style="color: #660066;">style</span>.<span style="color: #660066;">backgroundColor</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000066; font-weight: bold;">var</span> newColor <span style="color: #339933;">=</span> prompt<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'Enter a color:'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
document.<span style="color: #660066;">body</span>.<span style="color: #660066;">style</span>.<span style="color: #660066;">backgroundColor</span> <span style="color: #339933;">=</span> newColor<span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000066; font-weight: bold;">function</span> undoColor<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
<span style="color: #000066; font-weight: bold;">var</span> newColor <span style="color: #339933;">=</span> oldColor<span style="color: #339933;">;</span>
&nbsp;
oldColor <span style="color: #339933;">=</span> document.<span style="color: #660066;">body</span>.<span style="color: #660066;">style</span>.<span style="color: #660066;">backgroundColor</span><span style="color: #339933;">;</span>
&nbsp;
document.<span style="color: #660066;">body</span>.<span style="color: #660066;">style</span>.<span style="color: #660066;">backgroundColor</span> <span style="color: #339933;">=</span> newColor<span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #339933;">&lt;/</span>script<span style="color: #339933;">&gt;</span>
&nbsp;
<span style="color: #339933;">&lt;</span>button onclick<span style="color: #339933;">=</span><span style="color: #3366CC;">'changeColor()'</span><span style="color: #339933;">&gt;</span>Change color<span style="color: #339933;">&lt;/</span>button<span style="color: #339933;">&gt;</span>
&nbsp;
<span style="color: #339933;">&lt;</span>button onclick<span style="color: #339933;">=</span><span style="color: #3366CC;">'undoColor()'</span><span style="color: #339933;">&gt;</span>Undo color<span style="color: #339933;">&lt;/</span>button<span style="color: #339933;">&gt;</span></pre></td></tr></table></div>

<p>Si eres nuevo en JavaScript, puede que no estés familiarizado con la palabra función. En JavaScript, una función es una palabra clave del inicio de una sección de código que se ejecuta cuando se produce un evento, como dar clic en un botón. El código debajo de la función changeColor(){ almacena el color de fondo actual en la variable oldColor, y entonces solicita al visitante que ingrese un nuevo color de fondo, que es utilizado para  establecer el nuevo color de fondo. El código document.body.style.backgroundColor puede acceder al color de fondo actual de la página.</p>
<h2>A donde ir desde aquí</h2>
<p>Los ejemplos de código en este tutorial muestra cómo ejecutar un programa básico de JavaScript en un navegador usando una plantilla mínima de HTML. También aprendiste a realizar cálculos y trabajar con variables. Observamos cómo utilizar variables para almacenar los datos ingresados por los visitantes en cajas de diálogo, y luego utilizar el valor en el cálculo. Si te gustaría practicar estos conceptos, revisa las lecciones de la 1 a la 10 de los Vengadores del Código.</p>
<p>Si prefieres, empezar a aprender cómo utilizar las declaraciones if y bucles siguiendo con el resto de lecciones en el curso de JavaScript Nivel 1 de los Vengadores del Código. Visita el sitio de los Vengadores del Código y conviértete en un superhéroe de codificación!</p>
<p>La versión original de este artículo está publicada en <a href="http://www.adobe.com/devnet/html5/articles/intro-to-javascript-for-the-total-beginner.html">Adobe Devnet</a> bajo licencia Creative Commons, fue traducido y adaptado en nuestro blog por <a href="http://twitter.com/gr_maggi">Margarita García</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://activ.com.mx/javascript-para-principiantes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Uso de Modernizr para detectar soporte de HTML5</title>
		<link>http://activ.com.mx/uso-de-modernizr-para-detectar-soporte-de-html5/</link>
		<comments>http://activ.com.mx/uso-de-modernizr-para-detectar-soporte-de-html5/#comments</comments>
		<pubDate>Wed, 26 Sep 2012 17:26:17 +0000</pubDate>
		<dc:creator>jesus_macedo</dc:creator>
				<category><![CDATA[Articulos]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[articulos]]></category>
		<category><![CDATA[css3]]></category>
		<category><![CDATA[dreamweaver]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[modernizr]]></category>
		<category><![CDATA[tutoriales]]></category>

		<guid isPermaLink="false">http://activ.com.mx/?p=4852</guid>
		<description><![CDATA[Los exploradores antiguos se niegan a desaparecer, haciendo difícil el encorporar las últimas características de HTML5 y CSS3 en nuestros sitios web. Ahí es donde Modernizr, una librería open-source de JavaScript puede ayudar al detectar qué características soporta un explorador. Modernizr no intenta agregar esas características faltantes, pero sí permite adaptar el diseño de tu [...]]]></description>
				<content:encoded><![CDATA[<p>Los exploradores antiguos se niegan a desaparecer, haciendo difícil el encorporar las últimas características de <a href="http://activ.com.mx/cursos/web/html5/">HTML5 y CSS3</a> en nuestros sitios web. Ahí es donde <a href="http://modernizr.com/">Modernizr</a>, una librería open-source de JavaScript puede ayudar al detectar qué características soporta un explorador. <strong>Modernizr</strong> no intenta agregar esas características faltantes, pero sí permite <em>adaptar el diseño de tu página</em> creando reglas de estilo alternativas para los exploradores antiguos. También te permite <em>cargar scripts personalizados</em> para emular la funcionalidad faltante.</p>
<p style="text-align:center"><a href="http://modernizr.com/"><img src="http://activ.com.mx/wp-content/uploads/2012/09/modernizr.png" alt="Modernizr" width="372" height="55" class="aligncenter size-full wp-image-4853" /></a></p>
<p>Utilizar <strong>Modernizr</strong> es sencillo, aunque no es una varita mágica. El éxito al trabajar con él dependerá mayormente de tus habilidades con <em>CSS y JavaScript</em>. En este tutorial, aprenderás cómo aplicar estilos alternativos en exploradores que no soportan múltiples columnas o sombras. Tambien aprenderas como lograr que navegadores antiguos puedan validar formularios que hacen uso del nuevo atributo de HTML5 <em>required</em>, así como cargar scripts condicionalmente dependiendo de las capacidades del navegador.<br />
<span id="more-4852"></span></p>
<h2>¿Que es Modernizr?</h2>
<p>Modernizr es una librería de JavaScript que detecta cuáles características soporta un explorador. Actualmente revisa <em>18 características de CSS3 y más de 40 relacionadas con HTML5</em>, examinando cómo responde el explorador a una serie de pruebas. El conjunto completo de pruebas toma solo microsegundos en realizarse. Y para obtener todavía un mejor desempeño, el sitio web de Modernizr maximiza su eficiencia automatizando la creación de un <em>script</em> personalizado para probar solo aquellos elementos en los que estás interesado. </p>
<p>Cuando se utiliza para detectar el soporte de CSS3, Modernizr no requiere conocimientos de JavaScript. Simplemente adjunta el archivo a tu página web, y dinámicamente agregará el conjunto de clases al elemento <strong>html</strong> dependiendo de las capacidades del navegador. Los nombres de las clases están estandarizados y son autoexplicativos. Por ejemplo, la clase <em>boxshadow</em> se agrega si el navegador soporta la propiedad <em>box-shadow</em>; de lo contrario <em>no-boxshadow</em> se agrega en su lugar. Todo lo que necesitas es crear una hoja de estilos que use estas clases para brindar los estilos apropiados al explorador.</p>
<p>Modernizr hace fácil la implementación de soluciones JavaScript conocidas como <em>polyfills</em> que emulan características relacionadas a HTML5 y tecnologías asociadas, como la geolocalización. Sin embargo, necesitas al menos un entendimiento básico de de JavaScript para usarlas. Por cierto, el término <em>polyfill</em> viene de Polyfilla, el nombre de la marca inglesa de una pasta para reparar grietas. La idea es que un polyfill tape un agujero en la capacidad del navegador. A veces, realiza la tarea sin problemas pero es básicamente un trabajo de reparación, así que no se puede confiar en que produzca exactamente siempre los mismos resultados. </p>
<h3>Descargando Modernizr</h3>
<p>En común con otras librerías de JavaScript, <a href="http://modernizr.com/">Modernizr</a> esta disponible en versiones de <em>desarrollo</em> y <em>producción</em>. Con la mayoría de las librerías la única diferencia es que los espacios en blanco y los comentarios han sido removidos de la versión de producción para reducir el peso de la descarga, <a href="http://modernizr.com/">Modernizr</a> toma un enfoque diferente. La versión de desarrollo contiene casi todo, mientras que la versión de producción contiene únicamente aquellos elementos de tu elección, resultando en una descarga considerablemente más pequeña.</p>
<p>Cuando experimentes con <a href="http://modernizr.com/">Modernizr</a>, recomendamos que descargues la versión de desarrollo. Una vez que sepas como funciona y de lo que es capaz, puedes descargar una version de produccion personalizada para implementarla en tu sitio web. </p>
<p>Los archivos de ejemplo de este tutorial contienen la versión 2.0.6 de la versión de desarrollo de Modernizr, pero te recomiendo reemplazarla con la versión más actualizada del sitio de Modernizr.</p>
<ol>
<li>Descarga los archivos de ejemplo que acompañan este articulo (<a href="http://activ.com.mx/wp-content/uploads/2012/09/using_modernizr.zip">using_modernizr.zip</a>) y descomprimelos en un lugar conveniente dentro de un sitio de Dreamweaver, o crea un nuevo sitio para este tutorial. </li>
<li>Ve al sitio de Modernizr en http://www.modernizr.com</li>
<li>En la sección de descarga de Modernizr 2, da clic en el boton Desarrollo (ver imagen). La versión de desarrollo de Modernizr se abre directamente en la ventana de tu explorador.</li>
<li>En el menú principal de tu explorador, selecciona Save Page As, y guardala como modernizr.js en el folder js de los archivos de ejemplo, reemplazando el archivo actual si es necesario.</li>
</ol>
<p style="text-align:center"><img src="http://activ.com.mx/wp-content/uploads/2012/09/modernizr.jpg" alt="Modernizr una librería de Javascript para detección de HTML5" width="380" height="227" class="aligncenter size-full wp-image-4869" /></p>
<h2>Uso de Modernizr para detectar características CSS</h2>
<p>Como se mencionó anteriormente, <a href="http://modernizr.com/">Modernizr</a> no intenta agregar nuevas características a los exploradores antiguos, pero permite compensar la falta de características con tus estilos. Para demostrar cómo trabaja, los archivos de ejemplo contienen una pagina llamada <em>css_support_begin.html</em>. Si cargas la página en un explorador moderno, debería verse como a continuación: </p>
<p style="text-align:center"><img src="http://activ.com.mx/wp-content/uploads/2012/09/css_modernizr1.jpg" alt="Detección de características de CSS con Modernizr" width="380" height="288" class="aligncenter size-full wp-image-4870" /></p>
<p>Los estilos en la pagina usan las propiedades <em>column-count</em> y <em>box-shadow</em> de CSS3 para visualizar el texto en múltiples columnas y agrega una sombra a la imagen. Los exploradores antiguos no soportan ninguna de estas propiedades, así que la misma página se ve asi en Internet Explorer 7:</p>
<p style="text-align:center"><img src="http://activ.com.mx/wp-content/uploads/2012/09/css_modernizr2_ie7.jpg" alt="Visualización de Sitio Web en Internet Explorer 7" width="380" height="241" class="aligncenter size-full wp-image-4872" /></p>
<p>En IE 9, la misma página se visualiza con la sombra en la imagen, pero el texto está posicionado de la misma forma que en la imagen anterior. </p>
<p>Hasta donde llegar intentando compensar por la falta de características disponibles depende de los requerimientos de tu diseño. Intentar lograr que la página luzca igual en todos los navegadores involucra mucho trabajo, pero puedes hacer algunas mejoras sencillas, como envolver el texto alrededor de la imagen, alineando la imagen con el margen izquierdo del texto, y agregando un borde sutil a las esquinas derecha e inferior para darle un look más tridimensional. </p>
<h3>Detectando el soporte de las características de CSS3</h3>
<p><a href="http://modernizr.com/">Modernizr</a> usa JavaScript para detectar cuáles características soporta el explorador, pero antes de usar JavaScript para cargar diferentes hojas de estilo dinámicamente, usa la técnica extraordinariamente simple de agregar clases a las etiquetas <strong>html</strong> de las páginas. Es entonces cuando depende de ti como diseñador el usar la hoja de estilos CSS para servir apropiadamente los estilos a los elementos. Por ejemplo, si se soporta la propiedad box-shadow, Modernizr agrega la clase boxshadow. Si no es soportada esta propiedad, agrega la clase no-boxshadow en su lugar.</p>
<p>Ya que los exploradores ignoran las propiedades CSS que no reconocen, puedes utilizar con seguridad la propiedad box-shadow en tu regla de estilos básica, pero agregar un selector descendiente separado para exploradores antiguos como este:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="css" style="font-family:monospace;"><span style="color: #6666ff;">.no-boxshadow</span> img <span style="color: #00AA00;">&#123;</span>
    	<span style="color: #808080; font-style: italic;">/* estilos para exploradores que no soportan box-shadow */</span>
<span style="color: #00AA00;">&#125;</span></pre></td></tr></table></div>

<p>Solo los exploradores que no soportan <em>box-shadow</em> tendrán la clase <em>no-boxshadow</em>, asi que ningun otro explorador aplicará esta regla.</p>
<p>Agreguemos Modernizr a la página de ejemplo e inspeccionemos las clases que agrega a la etiqueta <strong>html</strong></p>
<ol>
<li>Haz una copia de <strong>css_support_begin.html</strong> y guardarlo como <strong>css_support.html</strong></li>
<li>Abre la copia que acabas de crear, y cambia a vista de código o a la vista dividida.</li>
<li>Las primeras dos líneas del formato HTML lucen así:</li>

<div class="wp_syntax"><table><tr><td class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #00bbdd;">&lt;!DOCTYPE HTML&gt;</span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;html<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<li>Agrega class=”no-js” a la etiqueta  de esta manera:

<div class="wp_syntax"><table><tr><td class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #00bbdd;">&lt;!DOCTYPE HTML&gt;</span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;html</span> <span style="color: #000066;">class</span>=<span style="color: #ff0000;">&quot;no-js&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span></pre></td></tr></table></div>

<p>Modernizr depende de que JavaScript esté habilitado en el explorador. Cuando así es, esta clase es removida dinámicamente. Sin embargo, en los raros casos en que JavaScript está deshabilitado, permanece en el formato HTML, permitiendote crear reglas de estilo especiales para los visitantes si es necesario.</li>
<li>Los estilos en <strong>css_support.html</strong> son embebidos en un bloque <strong>style</strong>. La librería de <a href="http://modernizr.com/">Modernizr</a> necesita ser agregada a la etiqueta  de la página después de que se han cargado los estilos. Agrega una nueva línea entre las etiquetas <strong>style</strong> y <strong>head</strong> de cierre y agrega <strong>modernizr.js</strong> usando una etiqueta <strong>script</strong>. La forma más sencilla es escribir el codigo por ti mismo, pero también puedes usar el boton Script en el panel de inserción o seleccionar <em>Insert &gt; HTML &gt; Script Objects &gt; Script</em>. Las últimas tres líneas del <strong>head</strong> debería verse así:

<div class="wp_syntax"><table><tr><td class="code"><pre class="html" style="font-family:monospace;">&lt;/style&gt;
&lt;script src=&quot;js/modernizr.js&quot;&gt;&lt;/script&gt;
&lt;/head&gt;</pre></td></tr></table></div>

<p><strong>Nota</strong>: Si usas el panel de inserción o el menú de inserción, Dreamweaver agrega type=”text/javascript” a la etiqueta de apertura <strong>script</strong>. Esto ya no es requerido en HTML5, pero no hace daño dejarlo.
</li>
<li>Guarda <strong>support_css.html</strong> y da clic al boton Live Code en la barra del documento. La etiqueta <strong>html</strong> ahora está poblada con más de 40 nombres de clases indicando las capacidades de la versión del motor de búsqueda WebKit que esta construido dentro de Dreamweaver.</li>
</ol>
<p style="text-align:center"><img src="http://activ.com.mx/wp-content/uploads/2012/09/css_modernizr3.jpg" alt="CSS Live Code en Dreamweaver usando Modernizr" width="380" height="155" /></p>
<p><strong>Nota:</strong> Si tu versión de Dreamweaver no tiene Live Code (o si estas usando un editor de HTML diferente), puedes inspeccionar el código generado usando las herramientas de desarrollador en muchos exploradores modernos o con Firebug en Firefox.</p>
<p>Como muestra la imagen anterior, la clase <em>no-js</em> ha sido reemplazada por js, indicando que JavaScript está habilitado. La siguiente tabla lista los nombres de las clases utilizados por Modernizr para indicar el soporte para CSS3. Si la característica no está soportada el nombre de la clase tiene el prefijo <strong>no-</strong>.</p>
<p><strong>Características de CSS3 detectadas por Modernizr</strong></p>
<table>
<tbody>
<tr>
<td>
<p><b>CSS Feature</b></p>
</td>
<td>
<p><b>Modernizr class (property)</b></p>
</td>
</tr>
<tr>
<td>
<p>@font-face</p>
</td>
<td>
<p>fontface</p>
</td>
</tr>
<tr>
<td>
<p>::before</p>
<p> and
<p>::after</p>
<p> pseudo-elements</td>
<td>
<p>generatedcontent</p>
</td>
</tr>
<tr>
<td>
<p>background-size</p>
</td>
<td>
<p>backgroundsize</p>
</td>
</tr>
<tr>
<td>
<p>border-image</p>
</td>
<td>
<p>borderimage</p>
</td>
</tr>
<tr>
<td>
<p>border-radius</p>
</td>
<td>
<p>borderradius</p>
</td>
</tr>
<tr>
<td>
<p>box-shadow</p>
</td>
<td>
<p>boxshadow</p>
</td>
</tr>
<tr>
<td>
<p>CSS animations</p>
</td>
<td>
<p>cssanimations</p>
</td>
</tr>
<tr>
<td>
<p>CSS 2D transformations</p>
</td>
<td>
<p>csstransforms</p>
</td>
</tr>
<tr>
<td>
<p>CSS 3D transformations</p>
</td>
<td>
<p>csstransforms3d</p>
</td>
</tr>
<tr>
<td>
<p>CSS transitions</p>
</td>
<td>
<p>csstransitions</p>
</td>
</tr>
<tr>
<td>
<p>flexible box layout</p>
</td>
<td>
<p>flexbox</p>
</td>
</tr>
<tr>
<td>
<p>gradients</p>
</td>
<td>
<p>cssgradients</p>
</td>
</tr>
<tr>
<td>
<p>hsla()</p>
</td>
<td>
<p>hsla</p>
</td>
</tr>
<tr>
<td>
<p>multi-column layout</p>
</td>
<td>
<p>csscolumns</p>
</td>
</tr>
<tr>
<td>
<p>multiple backgrounds</p>
</td>
<td>
<p>multiplebgs</p>
</td>
</tr>
<tr>
<td>
<p>opacity</p>
</td>
<td>
<p>opacity</p>
</td>
</tr>
<tr>
<td>
<p>reflection</p>
</td>
<td>
<p>cssreflections</p>
</td>
</tr>
<tr>
<td>
<p>rgba()</p>
</td>
<td>
<p>rgba</p>
</td>
</tr>
<tr>
</tr>
<tr>
<td>
<p>text-shadow</p>
</td>
<td>
<p>textshadow</p>
</td>
</tr>
</tbody>
</table>
<p>Donde se prueba una propiedad específica de CSS, el nombre de la clase es el mismo de la propiedad, solo se le remueve cualquier guión o paréntesis que contenga el nombre de la propiedad. Otras clases son nombradas después del módulo CSS3 al que se refieren.</p>
<h3>Creando una regla de estilos para exploradores antiguos</h3>
<p>Mira la tabla de arriba, puedes ver que Modernizr usa <em>boxshadow</em> y <em>csscolumns</em> para indicar el soporte para la propiedad <em>box-shadow</em> y el layout de multiples columnas respectivamente. Así que puedes crear reglas de estilo especiales usando las clases no-boxshadow y no-csscolumns para exploradores que no soportan estas características.</p>
<p>Para mantener sencillas las instrucciones, te mostrare solo las declaraciones de CSS. También puedes escribirlas directamente en la vista de código o usar la caja de diálogo para una nueva regla de CSS.</p>
<ol>
<li>Crea un nuevo selector descendiente (compuesto) para <strong>.no-boxshadow img</strong></li>
<li>Coloca los bordes derecho e inferior a 2 pixeles y de color gris sólido (yo escogí #8A8A8A). La regla de estilos resultante debería verse así:

<div class="wp_syntax"><table><tr><td class="code"><pre class="css" style="font-family:monospace;"><span style="color: #6666ff;">.no-boxshadow</span> img <span style="color: #00AA00;">&#123;</span>
   	<span style="color: #000000; font-weight: bold;">border-right</span><span style="color: #00AA00;">:</span> <span style="color: #cc00cc;">#8A8A8A</span> <span style="color: #933;">2px</span> <span style="color: #993333;">solid</span><span style="color: #00AA00;">;</span>
<span style="color: #000000; font-weight: bold;">border-bottom</span><span style="color: #00AA00;">:</span> <span style="color: #cc00cc;">#8A8A8A</span> <span style="color: #933;">2px</span> <span style="color: #993333;">solid</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span></pre></td></tr></table></div>

<p>Esto no es tan atractivo como una sombra traslúcida, pero sin embargo ayuda a que la imagen se destaque ligeramente del fondo.
</li>
<li>En los exploradores que no soportan el layout multi-columnas, necesitaras alinear la imagen y ajustar sus márgenes. Crea un nuevo selector descendiente para <strong>.no-csscolumns img</strong></li>
<li>Coloca la imagen hacia la izquierda (<em>float left</em>), y dale márgenes superior e inferior de 3px, un margen derecho de 8px, y un margen izquierdo de cero.  La declaración del estilo debería verse así:

<div class="wp_syntax"><table><tr><td class="code"><pre class="css" style="font-family:monospace;"><span style="color: #6666ff;">.no-csscolumns</span> img
<span style="color: #000000; font-weight: bold;">margin</span><span style="color: #00AA00;">:</span> <span style="color: #933;">3px</span> <span style="color: #933;">8px</span> <span style="color: #933;">3px</span> <span style="color: #cc66cc;">0</span><span style="color: #00AA00;">;</span>
<span style="color: #000000; font-weight: bold;">float</span><span style="color: #00AA00;">:</span> <span style="color: #000000; font-weight: bold;">left</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span></pre></td></tr></table></div>

</li>
<li>Asegúrate de que esta regla de estilos va después de la regla .columns img. Ambas reglas tienen la misma especificidad, así que el margen izquierdo de 10 pixeles en .columns img deberia sobreescribir la regla que acabas de crear si se encuentran en orden opuesto. Podrías renombrar .no-csscolumns img a .no-csscolumns .columns img para darle una especificidad mayor, pero es mejor mantener los selectores lo más simples posible. (Por cierto, si no estás seguro acerca de lo que es la especificidad, revisa el artículo <a href="http://www.adobe.com/devnet/dreamweaver/articles/css_specificity.html">Comprendiendo la Especificidad</a> de Adrian Senior. Es viejo, pero muy útil.)</li>
<li>Guarda css_support.html, y pruebalo en un explorador moderno. Debería verse exactamente como antes.</li>
<li>Prueba la página en un antiguo explorador ya sea de manera local en tu sistema o conectandote a BrowserLab. No hay sombras o columnas, pero la pagina ahora esta aceptablemente estilizada.</li>
</ol>
<p style="text-align:center">
<img src="http://activ.com.mx/wp-content/uploads/2012/09/browser_lab.jpg" alt="Browser Lab" width="380" height="292" class="aligncenter size-full wp-image-4890" /></p>
<p>En este ejemplo, únicamente he utilizado las clases con el prefijo <strong>no-</strong> para crear estilos especiales para exploradores antiguos. Sin embargo, no hay razón en absoluto por la cual no deberías usar ambas clases (con y sin prefijo) para servir diferentes prefijos a los exploradores de acuerdo a sus capacidades. Por ejemplo:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="css" style="font-family:monospace;"><span style="color: #6666ff;">.csscolumns</span> <span style="color: #00AA00;">&#123;</span>
    <span style="color: #808080; font-style: italic;">/* reglas para exploradores que soportan el layout multi-columnas */</span>
<span style="color: #00AA00;">&#125;</span>
<span style="color: #6666ff;">.no-csscolumns</span> <span style="color: #00AA00;">&#123;</span>
    <span style="color: #808080; font-style: italic;">/* reglas para exploradores que no soportan el layout multi-columnas */</span>
<span style="color: #00AA00;">&#125;</span></pre></td></tr></table></div>

<p>A veces este enfoque está justificado, por ejemplo, si quieres crear un layout completamente diferente para cada nivel de soporte. Pero si se trata simplemente de una cuestión de ofrecer estilos alternativos para exploradores antiguos, no olvides que los exploradores ignoran las propiedades que no reconocen. Si usas las clases de Modernizr para todos los estilos, tu página se verá totalmente sin estilos en los exploradores que tengan JavaScript deshabilitado.</p>
<h2>Usando Modernizr para detectar el soporte de HTML5</h2>
<p>Los nombres de las clases que <a href="http://modernizr.com/">Modernizr</a> agrega a la etiqueta de apertura de  sirven para un doble propósito. También son los nombres de las propiedades de JavaScript que el objeto Modernizr crea cuando se carga la página. La siguiente tabla lista las clases y propiedades relacionadas a HTML5 y tecnologías relacionadas, como la geolocalización.</p>
<p><strong>Características relacionadas con HTML5 detectadas por Modernizr</strong></p>
<table>
<tbody>
<tr>
<td>
<p><b>HTML5-related features</b></p>
</td>
<td>
<p><b>Modernizr property (class)</b></p>
</td>
</tr>
<tr>
<td>
<p>Application cache</p>
</td>
<td>
<p>applicationcache</p>
</td>
</tr>
<tr>
<td>
<p>Audio</p>
</td>
<td>
<p>audio.<i>type</i> (ogg, mp3, wav, m4a)</p>
</td>
</tr>
<tr>
<td>
<p>Canvas</p>
</td>
<td>
<p>canvas</p>
</td>
</tr>
<tr>
<td>
<p>Canvas text</p>
</td>
<td>
<p>canvastext</p>
</td>
</tr>
<tr>
<td>
<p>Drag and drop</p>
</td>
<td>
<p>draganddrop</p>
</td>
</tr>
<tr>
<td>
<p>Form input attributes</p>
</td>
<td>
<p>input.<i>attributeName</i></p>
</td>
</tr>
<tr>
<td>
<p>Form input elements</p>
</td>
<td>
<p>inputtypes.<i>elementName</i></p>
</td>
</tr>
<tr>
<td>
<p>Geolocation</p>
</td>
<td>
<p>geolocation</p>
</td>
</tr>
<tr>
<td>
<p>hashchange event</p>
</td>
<td>
<p>hashchange</p>
</td>
</tr>
<tr>
<td>
<p>History management</p>
</td>
<td>
<p>history</p>
</td>
</tr>
<tr>
<td>
<p>IndexedDB</p>
</td>
<td>
<p>indexeddb</p>
</td>
</tr>
<tr>
<td>
<p>Inline SVG</p>
</td>
<td>
<p>inlinesvg</p>
</td>
</tr>
<tr>
<td>
<p>Local storage</p>
</td>
<td>
<p>localstorage</p>
</td>
</tr>
<tr>
<td>
<p>Messaging</p>
</td>
<td>
<p>postmessage</p>
</td>
</tr>
<tr>
<td>
<p>Session storage</p>
</td>
<td>
<p>sessionstorage</p>
</td>
</tr>
<tr>
<td>
<p>SMIL</p>
</td>
<td>
<p>smil</p>
</td>
</tr>
<tr>
<td>
<p>SVG</p>
</td>
<td>
<p>svg</p>
</td>
</tr>
<tr>
<td>
<p>SVG clip paths</p>
</td>
<td>
<p>svgclippaths</p>
</td>
</tr>
<tr>
<td>
<p>Touch events</p>
</td>
<td>
<p>touch</p>
</td>
</tr>
<tr>
<td>
<p>Video</p>
</td>
<td>
<p>video.<i>type</i> (ogg, webm, h264)</p>
</td>
</tr>
<tr>
<td>
<p>WebGL</p>
</td>
<td>
<p>webgl</p>
</td>
</tr>
<tr>
<td>
<p>Web sockets</p>
</td>
<td>
<p>websockets</p>
</td>
</tr>
<tr>
<td>
<p>Web SQL database</p>
</td>
<td>
<p>websqldatabase</p>
</td>
</tr>
<tr>
<td>
<p>Web workers</p>
</td>
<td>
<p>webworkers</p>
</td>
</tr>
</tbody>
</table>
<p>En muchos casos, todas las propiedades en las tablas (de características CSS y HTML5) retornan un true o false. Así que puedes probar el almacenamiento local con JavaScript de esta manera:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>Modernizr.<span style="color: #660066;">localstorage</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #006600; font-style: italic;">// script para ejecutar si se soporta el almacenamiento local</span>
<span style="color: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #006600; font-style: italic;">// script para ejecutar si no se soporta el almacenamiento local</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Sin embargo, en el caso de audio y video, el valor de retorno es una cadena que indica el nivel de confianza de que el explorador pueda ejecutar el tipo especificado. De acuerdo a la especificación de HTML5, una cadena vacía significa que no se soporta el tipo. Si se soporta el tipo, el valor es “maybe” o “probably”. Por ejemplo:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>Modernizr.<span style="color: #660066;">video</span>.<span style="color: #660066;">h264</span> <span style="color: #339933;">==</span> <span style="color: #3366CC;">&quot;&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #006600; font-style: italic;">// no se soporta h264</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<h3>Usando Modernizr para validar los campos HTML5 form requeridos</h3>
<p>HTMl5 agrega muchos atributos nuevos a los forms, como un autofocus, el cual automáticamente pone en foco el campo especificado cuando se carga la página. Otro atributo útil es required, el cual previene que los exploradores compatibles con HTML5 envíen los datos de un form cuando un campo requerido esta en blanco.</p>
<p style="text-align:center">
<img src="http://activ.com.mx/wp-content/uploads/2012/09/required_fields.jpg" alt="Campos Requeridos Modernizr" width="370" height="224" class="aligncenter size-full wp-image-4893" /></p>
<p>Esto es genial, pero te deja con el problema de que hacer respecto a los exploradores antiguos. Una solución es ignorarlos, y dejar al final la validación del lado del servidor. Una forma más amigable al usuario de manejar la situación es crear un pequeño script para revisar los campos requeridos si el explorador no reconoce el atributo <em>required</em>.</p>
<ol>
<li>Haz una copia de <strong>required_start.html</strong> en los archivos de ejemplo, y guardalo como <strong>required.html</strong></li>
<li>Adjunta <strong>modernizr.js</strong> a la página utilizando un bloque de <strong>script</strong> justo antes del cierre <strong>head</strong> como se hizo anteriormente.</li>
<li>Crea un bloque <strong>script</strong> separado inmediatamente después del cierre de la etiqueta que enlaza la librería de Modernizr a la página, y crea un event handler para ejecutar el código tan pronto se termina de cargar la página:

<div class="wp_syntax"><table><tr><td class="code"><pre class="html" style="font-family:monospace;">&lt;script src=&quot;js/modernizr.js&quot;&gt;&lt;/script&gt;
&lt;script&gt;
window.onload = function() {
//codigo para ejecutar cuando se carga la pagina
};
&lt;/script&gt;
&lt;/head&gt;</pre></td></tr></table></div>

</li>
<li>El <em>event handler</em> necesita obtener una referencia de los elementos <strong>form</strong> y emular los atributos <em>autofocus</em> y required en exploradores que no los reconocen. Lidiar con <em>autofocus</em> es fácil:

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;">window.<span style="color: #660066;">onload</span> <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #006600; font-style: italic;">// obtiene el form y sus elementos input</span>
<span style="color: #000066; font-weight: bold;">var</span> form <span style="color: #339933;">=</span> document.<span style="color: #660066;">forms</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
inputs <span style="color: #339933;">=</span> form.<span style="color: #660066;">elements</span><span style="color: #339933;">;</span>
<span style="color: #006600; font-style: italic;">// Si no soporta autofocus, pone el foco en el primer campo</span>
<span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>Modernizr.<span style="color: #660066;">input</span>.<span style="color: #660066;">autofocus</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
inputs<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span>.<span style="color: #660066;">focus</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #006600; font-style: italic;">// Si no soporta required, lo emula</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>La condición prueba Modernizr.input.autofocus, el cual retorna false si no se soporta autofocus. Sin embargo, el operador lógico <strong>NO</strong> (el signo de exclamación) revierte el significado, así que si no se soporta <em>autofocus</em>, la condición evalúa a <em>true</em>, y con <strong>input[0].focus()</strong> coloca el foco en el primer campo <em>input</em>.
</li>
<li>Ahora agrega el código para revisar si no se soporta required. El código completo para el event handler se ve así:

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;">window.<span style="color: #660066;">onload</span> <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #006600; font-style: italic;">// obtiene el form y sus elementos input</span>
<span style="color: #000066; font-weight: bold;">var</span> form <span style="color: #339933;">=</span> document.<span style="color: #660066;">forms</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
inputs <span style="color: #339933;">=</span> form.<span style="color: #660066;">elements</span><span style="color: #339933;">;</span>
<span style="color: #006600; font-style: italic;">// Si no soporta autofocus, pone el foco en el primer campo</span>
<span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>Modernizr.<span style="color: #660066;">input</span>.<span style="color: #660066;">autofocus</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
inputs<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span>.<span style="color: #660066;">focus</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #006600; font-style: italic;">// Si no soporta required, lo emula</span>
<span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>Modernizr.<span style="color: #660066;">input</span>.<span style="color: #660066;">required</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
form.<span style="color: #660066;">onsubmit</span> <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #000066; font-weight: bold;">var</span> required <span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> att<span style="color: #339933;">,</span> val<span style="color: #339933;">;</span>
<span style="color: #006600; font-style: italic;">// ciclo con el cual se busca la propiedad required</span>
<span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">var</span> i <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&amp;</span>lt<span style="color: #339933;">;</span> inputs.<span style="color: #660066;">length</span><span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
att <span style="color: #339933;">=</span> inputs<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #660066;">getAttribute</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'required'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #006600; font-style: italic;">// si se encuentra required, obtiene el valor del campo y elimina los espacios en blanco</span>
<span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>att <span style="color: #339933;">!=</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
val <span style="color: #339933;">=</span> inputs<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #660066;">value</span><span style="color: #339933;">;</span>
<span style="color: #006600; font-style: italic;">// Si el campo esta vacio, lo agrega al arreglo required</span>
<span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>val.<span style="color: #660066;">replace</span><span style="color: #009900;">&#40;</span><span style="color: #009966; font-style: italic;">/^\s+|\s+$/g</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">''</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #3366CC;">''</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
required.<span style="color: #660066;">push</span><span style="color: #009900;">&#40;</span>inputs<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #660066;">name</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #006600; font-style: italic;">// muestra una alerta si el arreglo required contiene algun elemento</span>
<span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>required.<span style="color: #660066;">length</span> <span style="color: #339933;">&amp;</span>gt<span style="color: #339933;">;</span> <span style="color: #CC0000;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
alert<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'Los siguientes campos son requeridos: '</span> <span style="color: #339933;">+</span>
required.<span style="color: #660066;">join</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">', '</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #006600; font-style: italic;">// previene que se envie el form</span>
<span style="color: #000066; font-weight: bold;">return</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>El nuevo código crea una función que usa un ciclo con todos los elementos <em>input</em> del <strong>form</strong> cuando se intenta enviar los datos, busca los campos con el atributo <em>required</em>. Cuando encuentra una, retira los espacios al principio y al final del valor, si el resultado es una cadena vacía, agrega el campo al arreglo <em>required</em>. Si el arreglo contiene algún elemento después de que se revisaron todos los campos, el explorador mostrará una alerta con los nombres de los campos faltantes, y previene que se envíen los datos del form.
</li>
<li>Guarda <strong>required.html</strong> y cargalo en un explorador, como IE del 6 al 9, que no tiene soporte para forms de HTML5. Notaras como automáticamente se coloca el foco en el primer campo.</li>
<li>Da clic al boton <em>submit</em> sin haber completado ninguno de los campos. Deberías ver una alerta avisando que los campos name y email son requeridos.
<p style="text-align:center"><img src="http://activ.com.mx/wp-content/uploads/2012/09/required_fields2.jpg" alt="Campos Requeridos Modernizr" width="370" height="239" class="aligncenter size-full wp-image-4903" /></p>
</li>
<li>Prueba la página de nuevo pero completando un campo requerido. Cuando des clic a OK para cerrar la alerta, el campo que completaste aun tiene su contenido, indicando que el form no ha sido enviado. </li>
<li>Completa ambos campos requeridos, y da clic al boton submit. Esta ocasión, los campos se limpian, y deberías poder ver los datos adjuntos a la URL como una cadena de búsqueda en la barra de dirección del explorador.
</li>
<li>Prueba la página en un explorador compatible con HTML5, como la última versión de Firefox, Chrome u Opera. En vez de mostrar la alerta, el explorador muestra sus propios mensajes de error.
</li>
</ol>
<h2>Creando una versión de producción</h2>
<p>Cuando estás listo para desplegar tu sitio, se recomienda crear una versión de producción personalizada de Modernizr, que contenga sólo aquellos elementos que realmente necesitas. Esto puede reducir el peso de la librería de Modernizr <strong>desde 44KB a algo tan poco como 2KB,</strong> dependiendo de cuáles características elijas.</p>
<p style="text-align:center">
<img src="http://activ.com.mx/wp-content/uploads/2012/09/download_modernizr.jpg" alt="Descargar Modernizr" width="380" height="430" class="aligncenter size-full wp-image-4906" />
</p>
<p>Las opciones se agrupan convenientemente en categorías: <em>CSS3, HTML5, Misceláneos y Extras</em>. Dando click puedes seleccionar o deseleccionar las características.<br />
Por defecto, los siguientes elementos se encuentran seleccionados en la categoría de Extras:</p>
<ul>
<li><strong>HTML5 Shim/IEPP:</strong> Agrega dos scripts que fuerzan a IE del 6 al 8 a estilizar y mostrar los elementos HTML5 correctamente. Solo la necesitaras si tu plan es usar las nuevas etiquetas semánticas de HTML5, como header, footer, nav, y las demás.</li>
<li><strong>Modernizr.load(yepnope.js):</strong> Agrega un script cargador opcional, el cual no esta incluido en la versión de desarrollo. Agrega 3KB al peso de la descarga, asi que debes deseleccionarlo si no lo necesitas. Más adelante describiré su uso.</li>
<li><strong>Agregar clases CSS:</strong> Incluye las clases de Modernizr para la etiqueta de apertura . Debes seleccionar esta opción si quieres detectar el soporte de las características de CSS3.</li>
</ul>
<p>Si seleccionas cualquier opción en la categoría de CSS3, también se seleccionarán las siguientes opciones en la categoría de extras:</p>
<ul>
<li>Modernizr.testProp()</li>
<li>Modernizr.testAllProps()</li>
<li>Modernizr._domPrefixes()</li>
</ul>
<p>No deselecciones estas opciones. Al hacerlo, automáticamente deseleccionaras cualquier opción que hayas seleccionado de la categoría de CSS3.</p>
<p>MQ Polyfill(respond.js) en la categoría de Extras, agrega un script que te permite soporte limitado para media queries en IE del 6 al 8. Cuando lo seleccionas, automáticamente se seleccionan Media Queries y Modernizr.testStyles(). Para aprender más acerca del polyfill(respond.js) de media queries, visita <a href="https://github.com/scottjehl/Respond">https://github.com/scottjehl/Respond</a> Las opciones restantes en la categoría Extras son únicamente para usuarios avanzados. Para más detalles de qué son y cómo usarlas, revisa la sección de <a href="http://modernizr.com/docs/#s3">Extensibilidad en la documentación</a> de Modernizr.</p>
<h2>Usando Modernizr para cargar scripts externos</h2>
<p>Cuando se crea una versión de producción personalizada de Modernizr, la opción <strong>Modernizr.load()</strong> esta seleccionada por default. <strong>Modernizr.load()</strong> es un alias para <em>yepnope()</em>, un script independiente para cargar que fue desarrollado con Modernizr en mente. Para mostrar un ejemplo sencillo de como usarlo, movi el script de required.html a check_required.js e hice tres pequeños cambios para remover las pruebas Modernize y asignarlo a una variable llamada init. El script es este:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #000066; font-weight: bold;">var</span> init <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #006600; font-style: italic;">// obtiene el form y sus elementos input</span>
    <span style="color: #000066; font-weight: bold;">var</span> form <span style="color: #339933;">=</span> document.<span style="color: #660066;">forms</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
        inputs <span style="color: #339933;">=</span> form.<span style="color: #660066;">elements</span><span style="color: #339933;">;</span>
    <span style="color: #006600; font-style: italic;">// pone el foco en el primer campo</span>
    inputs<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span>.<span style="color: #660066;">focus</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #006600; font-style: italic;">// revisa los campos requeridos cuando se envia el form</span>
    form.<span style="color: #660066;">onsubmit</span> <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000066; font-weight: bold;">var</span> required <span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> att<span style="color: #339933;">,</span> val<span style="color: #339933;">;</span>
        <span style="color: #006600; font-style: italic;">// el ciclo busca la propiedad required en los elementos input</span>
        <span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">var</span> i <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span> i  <span style="color: #CC0000;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            alert<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'Los siguientes campos son requeridos: '</span> <span style="color: #339933;">+</span> required.<span style="color: #660066;">join</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">', '</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #006600; font-style: italic;">// previene que se envie el form</span>
            <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Una gran ventaja de <strong>Modernizr.load()</strong> es que carga condicionalmente los script dependiendo del resultado de la prueba de las capacidades del explorador, por lo cual se llama originalmente yepnope.js. Carga los scripts externos de forma asíncrona; en otras palabras, después de que el Document Object Model (DOM) ha cargado en el explorador;asi que puede ayudar a acelerar el rendimiento de tu sitio.</p>
<p>La sintaxis básica de <strong>Modernizr.load()</strong> es pasarle un objeto con las siguientes propiedades:</p>
<ul>
<li><strong>test</strong>: La propiedad que quieres que Modernizr pruebe.</li>
<li><strong>yep</strong>: La locación del script que quieres cargar si la prueba es exitosa. Usa un arreglo para varios scripts.</li>
<li><strong>nope</strong>: La locación del script que quieres cargar si la prueba falla. Usa un arreglo para varios scripts.<br />
complete: Una función a ser ejecutada tan pronto como se ha cargado el script externo (es opcional).</li>
</ul>
<p>Ambas yep y nope son opcionales, siempre que proporciones una de ellas.</p>
<p>Para cargar y ejecutar el script check_required.js, agrega el siguiente bloque <strong>script</strong> despues de donde se agregó modernizr.adc.js (el codigo esta en required_load.html):</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;">Modernizr.<span style="color: #660066;">load</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>
    test<span style="color: #339933;">:</span> Modernizr.<span style="color: #660066;">input</span>.<span style="color: #660066;">required</span><span style="color: #339933;">,</span>
    nope<span style="color: #339933;">:</span> <span style="color: #3366CC;">'js/check_required.js'</span><span style="color: #339933;">,</span>
    complete<span style="color: #339933;">:</span> <span style="color: #000066; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        init<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Trabaja exactamente como antes, pero reduce la carga de descarga en los exploradores que soportan el atributo required.<br />
Para probar múltiples condiciones, le puedes pasar un arreglo de objetos a <strong>Modernizr.load()</strong>. Para más detalles ve el tutorial de <strong>Modernizr.load()</strong> en la documentación de Modernizr.</p>
<h2>Precaución</h2>
<p>Modernizr es una herramienta muy poderosa y útil, pero eso no significa necesariamente que deberías usarla. No siempre es necesario usar Modernizr para brindar estilos alternativos a los exploradores. Si tu principal preocupación es Internet Explorer, considera utilizar comentarios condicionales para IE. También puedes usar la CSS para sobreescribir algunos estilos. Por ejemplo, usar primero un color hexadecimal y entonces con sobreescribirlo con un rgba() o hsla(). Los exploradores antiguos aun usar el primer valor e ignoran el segundo.</p>
<p>Modernizr realmente entra en el juego cuando se combina con polyfills y otro JavaScript. Pero recuerda que a menudo es muy sencillo crear tu propia prueba para las características soportadas. Por ejemplo, el siguiente código es lo único que requieres para probar si un explorador soporta el atributo required (el codigo esta en required_nomodernizr.html):</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #000066; font-weight: bold;">var</span> elem <span style="color: #339933;">=</span> document.<span style="color: #660066;">createElement</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'input'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">typeof</span> elem.<span style="color: #660066;">required</span> <span style="color: #339933;">!=</span> <span style="color: #3366CC;">'boolean'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #006600; font-style: italic;">// no se soporta required </span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<h3>A donde ir desde aquí</h3>
<p>Este tutorial ha cubierto todas las principales características de Modernizr. Para aprender mas acerca de estas caracteristicas, estudia la documentacion oficial en <a href="http://www.modernizr.com/docs/">http://www.modernizr.com/docs/</a>. Además puedes encontrar útiles los siguientes recursos:</p>
<p><a href="http://yepnopejs.com/">yepnopejs.com</a> brinda una covertura profunda de yepnope(), la cual esta incorporada en Modernizr como Modernizr.load().<br />
<a href="http://www.alistapart.com/articles/taking-advantage-of-html5-and-css3-with-modernizr/">Tomando Ventaja de HTML5 y CSS3 con Modernizr</a>, de Faruk Ate? (Líder del Proyecto Modernizr). Aunque esta basado en una versión anterior de Modernizr, este artículo contiene un ejemplo detallado de la mejora progresiva a través de Modernizr y CSS3.</p>
<p>La versión original de este artículo está publicada en <a href="http://www.adobe.com/devnet/dreamweaver/articles/using-modernizr.html">Adobe Devnet</a> bajo licencia Creative Commons, fue traducido y adaptado en nuestro blog por <a href="https://twitter.com/jesus_macedo">Jesús Pablo Macedo</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://activ.com.mx/uso-de-modernizr-para-detectar-soporte-de-html5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Adobe Edge preview 5 disponible en Labs</title>
		<link>http://activ.com.mx/adobe-edge-preview-5-disponible-en-labs/</link>
		<comments>http://activ.com.mx/adobe-edge-preview-5-disponible-en-labs/#comments</comments>
		<pubDate>Mon, 12 Mar 2012 18:49:35 +0000</pubDate>
		<dc:creator>edgarparada</dc:creator>
				<category><![CDATA[Adobe]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[Recursos]]></category>
		<category><![CDATA[adobe]]></category>
		<category><![CDATA[adobe edge]]></category>
		<category><![CDATA[css3]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://activ.com.mx/?p=4506</guid>
		<description><![CDATA[Adobe Edge el día de hoy anuncia la disponibilidad de su preview 5 en Adobe Labs. Edge es una herramienta de animación web y diseño de interactividad orientada a diseñadores para que puedan llevar contenido animado a sus sitios web mediante el uso de estándares web como HTML5, JavaScript y CSS3. En esta nueva versión [...]]]></description>
				<content:encoded><![CDATA[<p>Adobe Edge el día de hoy anuncia la disponibilidad de su <a href="http://labs.adobe.com/technologies/edge/">preview 5 en Adobe Labs</a>. Edge es una herramienta de animación web y diseño de interactividad orientada a diseñadores para que puedan llevar contenido animado a sus sitios web mediante el uso de estándares web como HTML5, JavaScript y CSS3. </p>
<p style="text-align:center"><a href="http://labs.adobe.com/technologies/edge/"><img src="http://activ.com.mx/wp-content/uploads/2012/03/edge_370x105.gif" alt="Adobe Edge preview 5" title="Adobe Edge preview 5" width="370" height="105" class="aligncenter size-full wp-image-4507" /></a></p>
<p>En esta nueva versión Edge introduce varias nuevas características enfocadas a mejorar la animación y optimización de recursos. La línea de tiempo ha recibido un comportamiento más natural así mismo que ya podemos encontrar herramientas de clipping y transformación tipo <em>on-stage</em>, y algunas opciones de publicación que para incluir soporte a navegadores web antiguos así como código optimizado.</p>
<p>Así que no esperes más para <a href="http://labs.adobe.com/technologies/edge/">descargar esta última versión</a> y comenzar a experimentar con una herramienta que promete bastante.</p>
]]></content:encoded>
			<wfw:commentRss>http://activ.com.mx/adobe-edge-preview-5-disponible-en-labs/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
