<?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; articulos</title>
	<atom:link href="http://activ.com.mx/tag/articulos-2/feed/" rel="self" type="application/rss+xml" />
	<link>http://activ.com.mx</link>
	<description>Adobe Authorized Training Center</description>
	<lastBuildDate>Fri, 17 May 2013 15:50:51 +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>Uso de Particulas con Away3D</title>
		<link>http://activ.com.mx/uso-de-particulas-con-away3d/</link>
		<comments>http://activ.com.mx/uso-de-particulas-con-away3d/#comments</comments>
		<pubDate>Wed, 01 May 2013 18:59:53 +0000</pubDate>
		<dc:creator>jesus_macedo</dc:creator>
				<category><![CDATA[Articulos]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[actionscript]]></category>
		<category><![CDATA[animación]]></category>
		<category><![CDATA[articulos]]></category>

		<guid isPermaLink="false">http://activ.com.mx/?p=5581</guid>
		<description><![CDATA[La versión alfa de Away3D 4.1 incluye soporte para la creación de sistemas de partículas de alto rendimiento basados en GPU con un API poderoso y configurable. Se puede usar esta habilidad para implementar efectos increíbles en tus proyectos 3D. Este tutorial introduce las bases del API, incluyendo la clase de partículas geométricas y la [...]]]></description>
				<content:encoded><![CDATA[<p>La versión alfa de <strong>Away3D 4.1</strong> incluye soporte para la creación de sistemas de partículas de alto rendimiento basados en <strong>GPU</strong> con un API poderoso y configurable. Se puede usar esta habilidad para implementar <strong>efectos increíbles</strong> en tus proyectos <strong>3D</strong>.</p>
<p style="text-align:center">
<img src="http://activ.com.mx/wp-content/uploads/2013/05/09275301d960f897ace19dff0c1c45cd-150x150.jpeg" alt="Logo Away3D" width="150" height="150"  class="aligncenter size-thumbnail wp-image-5659" />
<p>
Este tutorial introduce las bases del API, incluyendo la clase de partículas geométricas y la función de inicialización de la animación para controlar la vida y comportamiento de las partículas.
</p>
<p><span id="more-5581"></span></p>
<h2>Partículas Geométricas</h2>
<p>Lo primero que se necesita para las partículas, es un <strong>conjunto de geometría</strong>. Cada elemento es un conjunto que representara un tipo de partícula. Se puede usar cualquier figura geométrica, incluyendo figuras geométricas primitivas proporcionadas por Away3D o figuras geométricas cargadas desde un archivo externo. Sin embargo, no se recomiendan las figuras con muchos vértices, ya que afectaran el rendimiento de la animación.</p>
<p>Puedes estar preguntándote porque las figuras están predefinidas en lugar de ser creadas al vuelo como otros sistemas de partículas. Esto es debido a las limitaciones impuestas al búfer de carga de vértices, en el cual si se agregan las figuras de las partículas de forma dinámica, necesitara ocurrir mucho más frecuentemente. Cargar un búfer de vértices conlleva a un costo de rendimiento, así que es una buena idea el reducir dichas cargas si es posible. Además, las figuras geométricas dinámicas tienen restricciones al compartir el búfer de vértices a través de diferentes instancias de la animación.</p>
<p>La demostración incluye archivos de ejemplo (que puedes <a href="http://download.macromedia.com/pub/developer/games/demoasfiles.zip" target="_blank">descargar aquí</a>) para este tutorial que usan CubeGeometry como el conjunto de elementos geométricos. Puedes encontrar este código de ejemplo en el archivo TheBasicTutorial.as:</p>
<pre>
var cube:Geometry = new CubeGeometry(10, 10, 10);
var geometrySet:Vector. = new Vector.;
for (var i:int = 0; i &lt; 1000; i++){
    geometrySet.push(cube);
}
</pre>
<p>El código anterior agrega 1000 cubos al conjunto geométrico. Si se requiere, se pueden mezclar diferentes tipos de figuras geométricas en el mismo conjunto geométrico.</p>
<p>Una vez que el conjunto está listo, se puede usar el API para convertir el conjunto en la partícula geométrica final.</p>
<pre>var particleGeometry:ParticleGeometry = ParticleGeometryHelper.generateGeometry(geometrySet);</pre>
<p>Ahora se tiene la instancia final de la partícula geométrica, lista para su animación.</p>
<h2>Tiempo de vida de la Partícula</h2>
<p>El siguiente paso es crear un conjunto de partículas de animación. Puede que ya estés familiarizado con el concepto del ciclo de vida del tiempo de vida de las partículas. En un sistema de partículas tradicional, una partícula tiene un tiempo de vida definido, a través del cual otras propiedades (color, posición, etc.) son controladas.</p>
<p>En Away3D, una partícula tiene una propiedad <i>startFrame</i> relacionada al tiempo del sistema, y una propiedad opcional de duración. (Si no se especifica la duración, entonces la partícula tendrá una duración infinita). La propiedad de retraso (también opcional) representa el tiempo de retraso entre el fin de la duración de una partícula y el inicio de la duración de otra. Cuando se usan estas propiedades, una partícula aparecerá en su tiempo de inicio, se mantendrá &#8220;viva&#8221; durante su tiempo de duración, y entonces desaparecerá en su tiempo de retraso.</p>
<p>Debido a que estas propiedades son fundamentales para los cálculos de tiempo dentro del código del GPU, se tiene que predefinir cuales serán utilizadas. El primer parámetro del constructor <b>ParticleAnimationSet</b> indica si se estarán utilizando la propiedad <i>duration</i> de la partícula. El segundo parámetro indica si se usara una línea de tiempo cíclica (de modo que una vez una partícula ha completado su ciclo, automáticamente lo comenzara una nueva). EL tercero indica si las partículas desaparecerán en el tiempo de retraso antes del reinicio de sus ciclos.</p>
<p>En este ejemplo, las tres propiedades han sido establecidas en <i>true</i>:</p>
<pre>var animationSet:ParticleAnimationSet = new ParticleAnimationSet(true, true, true);</pre>
<p>Es importante notar que no hay propiedades en el conjunto de animación. Si las hubiera, todas las partículas tendrían las mismas propiedades y aparecerían y desaparecerían al mismo tiempo. En vez de ello, se usa una función que establece cada propiedad en las partículas de manera separada. debido a que son locales para cada partícula y se establecen una sola vez, <i>startTime, duration,</i> y <i>delay</i> son conocidas como propiedades estáticas locales. La función que establece estas propiedades será invocada para cada partícula. Se puede identificar el índice de la partícula usando el valor <b>ParticleProperties::index</b>, y entonces se establecen los valores <i>ParticleProperties::startTime, ParticleProperties::duration</i> y <i>ParticleProperties::delay</i> para la partícula, por ejemplo:</p>
<pre>
animationSet.initParticleFunc = initParticleParam;
private function initParticleParam(prop:ParticleProperties):void {
    prop.startTime = prop.index * 0.005;
    prop.duration = 10;
    prop.delay = 5;
}</pre>
<p>El código anterior crear un conjunto de propiedades estáticas locales que harán que las partículas inicien su ciclo cada 5 milisegundos de diferencia, las mantendrá &#8220;vivas&#8221; por 10 segundos, y entonces las enviara a &#8220;dormir&#8221; por 5 segundos.</p>
<h2>Posición de la Partícula</h2>
<p>Otros sistemas de partículas tienen un emisor que se usa para controlar la posición de origen de cada partícula. El sistema de partículas de Away3D implementa la misma funcionalidad de una forma más efectiva a través de <i>comportamientos</i> (uno de los conceptos más importantes en el API de partículas).</p>
<p>La clase <i>ParticlePositionNode</i> puede controlar la posición para cada partícula en la instancia de ParticleGeometry. La naturaleza de su control está determinada a través de una propiedad en constructor de la clase. Esto toma tres valores diferentes:</p>
<ul>
<li><b>ParticlePropertiesMode.LOCAL_STATIC</b> (las partículas pueden tener diferentes propiedades iniciales para el comportamiento).</li>
<li><b>ParticlePropertiesMode.GLOBAL</b> (todas las partículas tienen las mismas propiedades iniciales).</li>
<li><b>ParticlePropertiesMode.LOCAL_DYNAMIC</b> (las partículas pueden tener diferentes propiedades que son controladas al vuelo).</li>
</ul>
<p>Los modos <i>LOCAL_STATIC</i> y <i>GLOBAL</i> pueden compartir recursos de GPU a través de instancias de la animación, resultando en alto rendimiento. Así que, es una buena idea usar estos dos modos tanto como sea posible.</p>
<p>Este ejemplo usa <i>ParticlePropertiesMode.LOCAL_STATIC</i>:</p>
<pre>animationSet.addAnimation(new ParticlePositionNode(ParticlePropertiesMode.LOCAL_STATIC));</pre>
<p>Esto controla el valor de posición a través de la función <i>initParticleFunc</i>:</p>
<pre>
private function initParticleFunc(prop:ParticleProperties):void {
    prop.startTime = prop.index * 0.005;
    prop.duration = 10;
    prop.delay = 5;
    //calculate the original position of every particle.
    var percent:Number = prop.index / prop.total;
    var r:Number = percent * 1000;
    var x:Number = r*Math.cos(percent * Math.PI * 2 * 20);
    var z:Number = r*Math.sin(percent * Math.PI * 2 * 20);
    param[ParticlePositionNode.POSITION_VECTOR3D] = new Vector3D(x, 0, z);
}</pre>
<p>Antes de poder visualizar el efecto, se tiene que crear el material, mesh, y el objeto animador para las partículas. Esto toma el mismo enfoque que otras formas de animar en Away3D.</p>
<pre>
//create material, mesh and animator
var material:ColorMaterial = new ColorMaterial(0xff0000);
var particleMesh:Mesh = new Mesh(particleGeometry, material);
var animator:ParticleAnimator = new ParticleAnimator(animationSet);
particleMesh.animator = animator;
animator.start();
_view.scene.addChild(particleMesh);</pre>
<p style="text-align: center"><a href="http://download.macromedia.com/pub/developer/games/demos/preview.html"><img src="http://activ.com.mx/wp-content/uploads/2013/04/away3d-particle-introduction-fig01.jpg" alt="Particulas con Away3D" /></a></p>
<p>(click en la imagen para lanzar ejemplo)</p>
<h2>Velocidad de la Partícula</h2>
<p>Ahora ya se está listo para hacer que las partículas se muevan. Para esto, se necesitara utilizar otro comportamiento, el <i>ParticleVelocityNode</i>, el cual es un nodo de la animación de la partícula usado para establecer la velocidad inicial de la partícula.</p>
<p>Ya sabes que se debería estar usando ambos modos <i>LOCAL_STATIC</i> o <i>GLOBAL</i> tanto como sea posible. Pero, ¿cuál es mejor para esta aplicación? Internamente, el modo <i>LOCAL_STATIC</i> usa una corriente de registros para pasar los datos al GPU, de modo que los datos pueden ser representados por partícula. Sin embargo, <i>GLOBAL</i> usa registros constantes para pasar los datos por comportamiento. El número de corrientes de registros disponibles es más bajo que el número de registros constantes, y las corrientes de registros requieren más datos y más tiempo de inicialización. Así que como regla, deberías optar por el modo <i>GLOBAL</i> cuando sea posible.</p>
<p>En este caso, el objetivo es tener todas las partículas moviéndose con la misma velocidad, así que se puede usar el modo <i>ParticlePropertiesMode.GLOBAL</i>:</p>
<pre>
animationSet.addAnimation(new ParticleVelocityNode(ParticlePropertiesMode.GLOBAL, new Vector3D(0, 50, 0)));</pre>
<p>Así luce el resultado:</p>
<p style="text-align: center"><a href="http://download.macromedia.com/pub/developer/games/demos/TheBasicTutorial.html"><img src="http://activ.com.mx/wp-content/uploads/2013/04/away3d-particle-introduction-fig02.jpg" alt="Particulas con Away3D" /></a></p>
<p>(click en la imagen para lanzar ejemplo)</p>
<h2>A dónde ir desde aquí</h2>
<p>Has visto como crear una partícula geométrica, como establecer el tiempo de inicio y las propiedades de posición en partículas individuales, y cómo hacer que se muevan. Por supuesto, el API tiene muchas más características que las que se cubrieron aquí, pero ahora tienes un buen punto de partida desde el cual se pueden crear efectos impresionantes! Solo como un ejemplo, puedes crear el siguiente efecto usando las únicas características descritas en este tutorial:</p>
<p style="text-align: center"><a href="http://download.macromedia.com/pub/developer/games/demos/TheAdvancedDemo.html"><img src="http://activ.com.mx/wp-content/uploads/2013/04/away3d-particle-introduction-fig03.jpg" alt="Ejemplo" /></a></p>
<p>(click en la imagen para lanzar ejemplo)</p>
<p>Aquí hay algunos recursos que puedes usar para continuar aprendiendo acerca de Away3dD:</p>
<ul>
<li><a href="http://www.adobe.com/devnet/flashplayer/articles/creating-games-away3d.html">Creando juegos 3D y aplicaciones con Away3D y Stage 3D &#8211; Parte 1: Configurando un proyecto de 3D en 30 minutos</a></li>
<li><a href="http://www.adobe.com/devnet/flashplayer/articles/away3d-starling-interoperation.html">Interoperando Away3D y Starling</a></li>
<li><a href="http://www.adobe.com/devnet/flashplayer/articles/away3d-autodesk3dsmax.html">Creando una animación 3D interactiva con Away3D y Autodesk 3ds Max</a></li>
<li><a href="http://away3d.com/documentation/">Referencia y documentacion del API de Away3D</a></li>
</ul>
<p>Recuerda que en Activ tenemos un <a href="http://activ.com.mx/cursos/interactive/actionscript/" title="Curso de AS3" target="_blank">curso de ActionScript</a> que te ayudará a sacarle más aprovecho a Away3D</p>
<p>La versión original de este artículo está publicada en <a href="http://www.adobe.com/devnet/games/articles/away3d-particle-introduction.edu.html">Adobe Devnet</a> bajo licencia Creative Commons, fue traducido y adaptado en nuestro blog por <a href="http://twitter.com/jesus_macedo">Jesús Macedo</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://activ.com.mx/uso-de-particulas-con-away3d/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Diseño de Aplicaciones Móviles MultiScreen</title>
		<link>http://activ.com.mx/diseno-de-aplicaciones-moviles-multiscreen/</link>
		<comments>http://activ.com.mx/diseno-de-aplicaciones-moviles-multiscreen/#comments</comments>
		<pubDate>Thu, 07 Feb 2013 16:00:03 +0000</pubDate>
		<dc:creator>jesus_macedo</dc:creator>
				<category><![CDATA[Articulos]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[actionscript]]></category>
		<category><![CDATA[articulos]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[plataforma flash]]></category>
		<category><![CDATA[tablet]]></category>

		<guid isPermaLink="false">http://activ.com.mx/?p=5265</guid>
		<description><![CDATA[Se han ido los días en que se debía asegurar que los gráficos fueran de 72dpi. Con una afluencia de dispositivos y tabletas listos para la web con nuevos tamaños de pantalla, resoluciones, y pixeles por pulgada. Debes asegurarte que los gráficos de tu aplicación móvil estén en el tamaño correcto a pesar del dispositivo. [...]]]></description>
				<content:encoded><![CDATA[<p>Se han ido los días en que se debía asegurar que los gráficos fueran de <strong>72dpi</strong>. Con una afluencia de dispositivos y tabletas listos para la web con nuevos tamaños de pantalla, resoluciones, y pixeles por pulgada. Debes asegurarte que los gráficos de tu aplicación móvil estén en el tamaño correcto a pesar del dispositivo.</p>
<p style="text-align:center"><img src="http://activ.com.mx/wp-content/uploads/2013/01/screen_sizes_small.jpg" alt="Tamaños de pantalla" width="380" height="342" /></p>
<p>Empezando con el iPad de Apple, las tabletas han sido el dispositivo del año. Pero la gran pregunta fue si es una novedad o si tiene un valor duradero. <strong>Business Insider </strong>reporto que, entre los 500 dueños de un iPad a los cuales encuestaron, su uso se ha incrementado casi un 80% desde la primera compra. Por experiencia personal, puedo decirte que uso la mía cerca de una hora todos los días, tanto para leer como para jugar.</p>
<p><span id="more-5265"></span></p>
<h2>Especificaciones de la pantalla</h2>
<p>Sabiendo que las tabletas han llegado para quedarse, como diseñas para estas así como para computadoras de escritorio y otros dispositivos móviles? La tabla 1 muestra las especificaciones de pantalla de las tabletas mas populares.</p>
<table rules="rows" cellspacing="4" cellpadding="4" border="0">
<tbody>
<tr>
<td align="center" width="25%" valign="bottom"><strong></strong></td>
<td align="center" width="26%" valign="bottom"><strong>PC</strong></td>
<td align="center" width="31%" valign="bottom"><strong>Dispositivos Móviles</strong></td>
<td align="center" width="31%" valign="bottom"><strong>Tabletas</strong></td>
</tr>
<tr>
<td bgcolor="#ffffff" align="center"><strong>Tamaño de Pantalla</strong></td>
<td align="center" valign="middle">15&quot; laptops<br />
      17&quot; – 24&quot; pc</td>
<td align="center" valign="middle">4.3&quot; Droid X<br />
        3.7&quot; Droid 2<br />
      3.5&quot; Apple iPhone 4</td>
<td align="center" valign="middle">7&quot; Samsung Galaxy Tab<br />
        7&quot; BlackBerry PlayBook<br />
      9.7&quot; Apple iPad</td>
</tr>
<tr>
<td bgcolor="#ffffff" align="center"><strong>Resolución</strong></td>
<td align="center" width="25%" valign="middle"><a href="http://en.wikipedia.org/wiki/Display_resolution" target="_blank">1024 × 768 (20%)</a><br />
        <a href="https://netaverages.adobe.com/en-us/index.html?trackingID=FBXAW#state=onionRing;report=2" target="_blank">1280 × 800 (higher 76%)</a></td>
<td align="center" width="26%" valign="middle">480 × 854 Droid 2<br />
        480 × 854 Droid X<br />
        640 × 960 iPhone 4</td>
<td align="center" width="31%" valign="middle">1024 × 600 Samsung Galaxy Tab<br />
        1024 × 600 BlackBerry PlayBook<br />
        1024 × 768 Apple iPad</td>
</tr>
<tr>
<td bgcolor="#ffffff" align="center"><strong>Pixeles por pulgada</strong></td>
<td align="center" valign="middle">72</td>
<td align="center" valign="middle">264 Droid 2<br />
        227 Droid X<br />
        <a href="http://www.apple.com/iphone/specs.html" target="_blank">326 ppi iPhone 4G</a></td>
<td align="center" valign="middle">170 Samsung Galaxy Tab<br />
        170 BlackBerry PlayBook<br />
        133 Apple iPad</td>
</tr>
<tr>
<td bgcolor="#ffffff" align="center"><strong>Platforma</strong></td>
<td align="center" width="25%" valign="middle">Windows<br />
        Mac</td>
<td align="center" width="26%" valign="middle">Android 2.2<br />
        iOS</td>
<td align="center" width="31%" valign="middle">Android 2.2<br />
        BlackBerry Tablet OS<br />
        iOS</td>
</tr>
</tbody>
</table>
<h2>Dimensionando gráficos apropiadamente</h2>
<p>Cuando se llega a la PC, se podría hacer fácilmente un botón de 100 pixeles de ancho por 30 pixeles de alto y confiar en que el usuario podrá seleccionarlo con el cursor de su mouse, ya que los pixeles por pulgada (o puntos por pulgada) era 72. Cuando se llega a tabletas y dispositivos móviles, sin embargo, el cursor el reemplazado por un dedo y la resolución ya no es 72dpi. Ambos de estos factores hacen el tamaño del boton algo muy importante.</p>
<p><strong>Nota:</strong> Asi como se trabaja con gráficos bitmap, se debe tener en cuenta que mientras sea mayor el DPI, el tamaño del archivo sera mayor.</p>
<p><strong>Tamaño del dedo</strong></p>
<p>Si tomas la medida del tamaño promedio de la huella dactilar de un adulto, es al menos un cuadrado de media pulgada. Ese es el porque los iconos de los dispositivos iOS son de este tamaño. Por lo tanto, ese es el tamaño del que quieres tu botón. Pero como te aseguras de que el botón sera de este tamaño en todos los dispositivos?</p>
<p><strong>Pixeles por pulgada</strong></p>
<p>Antes de comenzar a dimensionar el contenido, necesitas asegurarte de que nada se escale automáticamente:</p>
<pre>stage.scaleMode = StageScaleMode.NO_SCALE;</br>
stage.align = StageAlign.TOP_LEFT;</pre>
<p>Un vistazo rápido a estas especificaciones revela que los pixeles por pulgada (ppi) varían. Para asegurarse de que un botón sera siempre de 0.5&quot;, solo multiplica el ppi (también conocido como dpi) por 0.5. En ActionScript 3 esto seria de esta forma:</p>
<pre>next_btn.width = 133 * .5;</br>
next_btn.height = 133 *.5;</pre>
<p>Pero realmente no quieres hacer este calculo para <em>cada</em> dispositivo. Por suerte, en Adobe Flash Professional puedes usar la propiedad <em>Capabilities.screenDPI</em> para determinar el DPI de la pantalla de cada dispositivo. Entonces solo multiplica eso por 0.5:</p>
<pre>next_btn.width = Capabilities.screenDPI * .5;</br>
next_btn.height = Capabilities.screenDPI * .5;</pre>
<p> Aquí hay una versión del código para determinar el tamaño en pixeles de tu botón si conoces su tamaño en milímetros en vez de pulgadas:</p>
<pre>next_btn.width = Capabilities.screenDPI * (mm / 25.4);</br>
next_btn.height = Capabilities.screenDPI * (mm / 25.4);</pre>
<h2>Siempre prueba</h2>
<p>Debido a que Android 2.2 no esta construido para tabletas &#8211;incluso aunque hay tabletas en el mercado (como la Samsung Galaxy Tab)&#8211; la propiedad Capabilities.screenDPI dará una resolución errónea de 240 cuando la resolución real es 170. Tendrás que realizar una revisión extra y cambiarla apropiadamente:</p>
<pre>if(Capabilities.screenDPI.manufacturer == &quot;Android Linux&quot; &amp;&amp; Capabilities.screenResolitionY == 1024)</br>
{</br>
	next_btn.width = 85;</br>
	next_btn.height = 85;</br>
}</pre>
<p>La siguiente figura muestra el botón dimensionado correctamente a través de tres dispositivos: Droid 2, iPad y Samsung Galaxy Tab.</p>
<p style="text-align:center"><img src="http://activ.com.mx/wp-content/uploads/2013/01/fig011.jpg" alt="Prueba en diferentes dispositivos" width="380" height="295" /></p>
<h2>A donde ir desde aquí</h2>
<p>Para encontrar más acerca de la propiedad Capabilities.screenDPI, revisa los siguientes artículos y referencias:</p>
<ul>
<li><a href="http://www.adobe.com/devnet/flash/articles/authoring_for_multiple_screen_sizes.html">Autoría de contenido Flash móvil para múltiples tamaños de pantalla</a></li>
<li>La clase<a href="http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/system/Capabilities.html"> flash.systemCapabilities</a> (Referencia de ActionScript 3 para la Plataforma Flash)</li>
<li>La clase <a href="http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/mx/core/RuntimeDPIProvider.html">mx.core.RuntimeDPIProvider</a> (Referencia de ActionScript 3 para la Plataforma Flash)</li>
</ul>
<p> Así como se trabaja con gráficos bitmap, se debe tener en cuenta que mientras sea mayor el DPI, el tamaño del archivo sera mayor. Revisa estos vídeos para aprender más acerca de la optimización de gráficos:</p>
<ul>
<li><a href="http://tv.adobe.com/watch/adobe-evangelists-paul-trani/screen-density/">Densidad de pantalla</a> (Adobe TV)</li>
<li><a href="http://tv.adobe.com/watch/adobe-evangelists-paul-trani/optimizing-graphics-with-actionscript/">Optimizando graficos con ActionScript</a> (Adobe TV)</li>
<li><a href="http://tv.adobe.com/watch/adobe-evangelists-paul-trani/optimizing-graphics/">Optimizando gráficos en el escenario en Flash Professional</a> (Adobe TV)</li>
</ul>
<p> También puedes aprender acerca de la optimización de gráficos utilizando una herramienta como Adobe Fireworks CS5:</p>
<ul>
<li><a href="http://www.adobe.com/devnet/fireworks/learning_guide/design/design_guide_pt8.html">Guía de aprendizaje de diseño en Fireworks: Optimizando archivos para múltiples exportaciones</a></li>
<li><a href="http://help.adobe.com/en_US/fireworks/cs/using/WS4c25cfbb1410b0021e63e3d1152b00db4b-7ff1.html">Optimizando y exportando gráficos </a> (Documentación de Fireworks)</li>
</ul>
<p>La versión original de este artículo está publicada en <strong><a href="http://www.adobe.com/devnet/devices/articles/sizing-graphics-across-screens.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/diseno-de-aplicaciones-moviles-multiscreen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Usar extensiones nativas en Adobe Flash Professional CS6</title>
		<link>http://activ.com.mx/usar-extensiones-nativas-en-adobe-flash-professional-cs6/</link>
		<comments>http://activ.com.mx/usar-extensiones-nativas-en-adobe-flash-professional-cs6/#comments</comments>
		<pubDate>Thu, 07 Feb 2013 14:34:13 +0000</pubDate>
		<dc:creator>jesus_macedo</dc:creator>
				<category><![CDATA[Adobe]]></category>
		<category><![CDATA[AIR]]></category>
		<category><![CDATA[Articulos]]></category>
		<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[actionscript]]></category>
		<category><![CDATA[adobe]]></category>
		<category><![CDATA[air]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[articulos]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[iPad]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[plataforma flash]]></category>

		<guid isPermaLink="false">http://activ.com.mx/?p=5319</guid>
		<description><![CDATA[Con la introducción del SDK de AIR 3, Adobe permite a los desarrolladores externos extender la plataforma AIR con código nativo. Esta característica hace a las aplicaciones de AIR más competitivas que nunca antes, debido a que les permite tomar ventaja de grandes características de la plataforma, incluyendo las compras In-App, Facebook, iAd, GameCenter y [...]]]></description>
				<content:encoded><![CDATA[<p>Con la introducción del SDK de AIR 3, Adobe permite a los desarrolladores externos extender la plataforma AIR con código nativo. Esta característica hace a las aplicaciones de AIR más competitivas que nunca antes, debido a que les permite tomar ventaja de grandes características de la plataforma, incluyendo las compras In-App, Facebook, iAd, GameCenter y AdMob. Con el reciente lanzamiento de CS6, se pueden integrar extensiones nativas de AIR a las aplicaciones con unos cuantos clicks.</p>
<p style="text-align:center"><img src="http://activ.com.mx/wp-content/uploads/2013/01/tumblr_m7s1txU8zI1r3jb51o1_r1_500.jpg" alt="ANE" /></p>
<p><span id="more-5319"></span></p>
<h2>Adquiriendo las extensiones nativas (ANE)</h2>
<p>Las extensiones nativas para AIR están empaquetadas como archivos con la extensión .ane. Milkman Games proporciona extensiones comerciales para iOS, Android, y Amazon incluyendo <a href="http://www.milkmangames.com/blog/tools/#ratebox">Ratings</a>, <a href="http://www.milkmangames.com/blog/tools/#goviral">Facebook</a>, <a href="http://www.milkmangames.com/blog/tools/#goviral">Twitter</a>, <a href="http://www.milkmangames.com/blog/tools/#androidiab">compras In-App</a>, <a href="http://www.milkmangames.com/blog/tools/#iosgc">Game Center</a>, <a href="http://www.milkmangames.com/blog/tools/#androidadmob">AdMob</a>, y otras extensiones. Adobe mantiene una gran lista de extensiones de la comunidad para móviles, Windows y Mac que puedes explorar en el Centro de Desarrollo de Adobe AIR, en la pagina de <a href="http://www.adobe.com/devnet/air/native-extensions-for-air.html">Extensiones Nativas para Adobe AIR</a>.</p>
<p>Una vez que has descargado la extensión nativa, necesitaras agregarla a tu proyecto en Flash Professional CS6.</p>
<h2>Agregar extensiones nativas a un proyecto de Flash Professional CS6</h2>
<p>Las extensiones nativas de Adobe AIR pueden trabajar con proyectos de AIR para Windows, Mac y Android. Puedes integrar una extensión nativa dentro de tu proyecto en Flash Professional CS6 en unos pasos sencillos:</p>
<ol>
<li>Abre Flash Professional CS6, y crea un nuevo proyecto de AIR, AIR para Android, o AIR para iOS.
  </li>
</ol>
<p style="text-align:center"><img src="http://activ.com.mx/wp-content/uploads/2013/01/fig013.jpg" alt="Crear Proyecto" /></p>
<ol start="2">
<li>Elige File &gt; Publish Settings.</li>
<li>Da clic en el icono de la llave junto a la configuración de Script para ActionScript.</li>
</ol>
<p style="text-align:center"><img src="http://activ.com.mx/wp-content/uploads/2013/01/fig031.jpg" alt="Configuración ActionScript" /></p>
<ol start="4">
<li>Da clic en la pestaña de Library Path.</li>
<li>Da clic en el botón Browse to a Native Extension (ANE) file.</li>
</ol>
<p style="text-align:center"><img src="http://activ.com.mx/wp-content/uploads/2013/01/fig021.jpg" alt="Buscar ANE" /></p>
<ol start="6">
<li>Navega al directorio que contiene la extensión nativa y selecciónala.</li>
<li>Da clic en OK</li>
</ol>
<h2>Implementar código ActionScript</h2>
<p>Las extensiones nativas incluyen APIs de ActionScript para interactuar con código nativo. Una vez se ha incluido un archivo ANE, estas APIs estarán disponibles para completar el código dentro de Flash Professional. Puedes encontrar tutoriales paso a paso para implementar las extensiones de <a href="http://www.adobe.com/devnet/air/articles/iad-ane-ios.html">iAd</a>, <a href="http://www.adobe.com/devnet/air/articles/gamecenter-ane-ios.html">GameCenter</a>, y <a href="http://www.adobe.com/devnet/air/articles/admob-ane-android.html">AdMob</a>, en el <a href="http://www.adobe.com/devnet/air.html">Centro de Desarrollo de Adobe AIR</a>.</p>
<p>Cuando termines selecciona File &gt; Publish, e implementa tu aplicación en tu plataforma de desarrollo!</p>
<h2>A donde ir desde aquí</h2>
<p>Ahora que te es familiar lo básico acerca del uso de extensiones nativas en Flash Professional CS6, puedes usar los siguientes enlaces para explorar la creciente lista de extensiones nativas disponibles para la plataforma AIR o aprender como empezar a crear tus propias extensiones:</p>
<ul>
<li><a href="http://www.adobe.com/devnet/air/native-extensions-for-air.html">Lista de Extensiones de la Comunidad de Adobe AIR</a></li>
<li><a href="http://www.milkmangames.com/blog/2011/09/25/developing-android-extensions-for-air-3-a-beginners-guide/">Desarrollando una Extensión Nativa de Android: La Guía del Principiante</a></li>
<li><a href="http://www.adobe.com/devnet/air/articles/gamecenter-ane-ios.html">Usar la extensión nativa de GameCenter de Adobe AIR para iOS</a></li>
<li><a href="http://www.adobe.com/devnet/air/articles/iad-ane-ios.html">Usar la extensión nativa de iAd de Adobe AIR para iOS</a></li>
<li><a href="http://www.adobe.com/devnet/air/articles/admob-ane-android.html">Usar la extensión nativa de AdMob de Adobe AIR para iOS</a></li>
</ul>
<p>La versión original de este artículo está publicada en <strong><a href="http://www.adobe.com/devnet/air/articles/using-ane-in-flash.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/usar-extensiones-nativas-en-adobe-flash-professional-cs6/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Introducción a jQuery Mobile</title>
		<link>http://activ.com.mx/introduccion-a-jquery-mobile/</link>
		<comments>http://activ.com.mx/introduccion-a-jquery-mobile/#comments</comments>
		<pubDate>Thu, 17 Jan 2013 17:16:55 +0000</pubDate>
		<dc:creator>gr_maggi</dc:creator>
				<category><![CDATA[Activ]]></category>
		<category><![CDATA[Articulos]]></category>
		<category><![CDATA[Dreamweaver]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[articulos]]></category>
		<category><![CDATA[dreamweaver]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[mobile]]></category>

		<guid isPermaLink="false">http://activ.com.mx/?p=5226</guid>
		<description><![CDATA[Probablemente tienes uno en tu bolsa, o puedes estar hablándole, o puedes estar jugando en el, es un Smartphone. La categoría de Smartphone parece ser bastante amplia -es un teléfono Android, un dispositivo iOS de Apple, un teléfono BlackBerry o algo más? Para darte una prueba, aquí hay una lista de algunos dispositivos móviles que [...]]]></description>
				<content:encoded><![CDATA[<p>Probablemente tienes uno en tu bolsa, o puedes estar hablándole, o puedes estar jugando en el, es un Smartphone. La categoría de Smartphone parece ser bastante amplia -es un teléfono Android, un dispositivo iOS de Apple, un teléfono BlackBerry o algo más? Para darte una prueba, aquí hay una lista de algunos dispositivos móviles que están en la categoría de Smartphone:</p>
<p style="text-align:center"><img src="http://activ.com.mx/wp-content/uploads/2013/01/jquery-mobile-logo.gif" alt="jquery-mobile-logo" width="187" height="58" class="aligncenter size-full wp-image-5259" /></p>
<ul>
<li>Apple iPhone/iPod Touch</li>
<li>Google Android</li>
<li>RIM BlackBerry/Playbook OS</li>
<li>Nokia Symbian (retirado, pero aún tiene casi 1 billón de usuarios en el mundo)</li>
<li>HP/Palm WebOS</li>
<li>Microsoft Window Phone 7  </li>
</ul>
<p><span id="more-5226"></span></p>
<p>El reto que tienes es un vasto número de diferentes sistemas y soporte fragmentado de los estándares. Por ejemplo, el último iPhone de Apple tiene un soporte impresionante para estándares de HTML5, mientras que Symbian y la Microsoft Phone actualmente tienen poco o nada. Para permitirte crear sitios web para dispositivos móviles, la comunidad jQuery ha estado trabajando en un framework que puedes aprovechar, se llama jQuery Mobile. Este artículo te proporciona una introducción a este nuevo framework, el cual aun esta en versión alfa; y te ayudará a iniciar tus habilidades de desarrollo con jQuery Mobile. </p>
<h2>Desarrollando sitios web con jQuery Mobile</h2>
<p>Desarrollar sitios web ya no es un elemento en la lista de deseos para el equipo de diseño web -es una realidad-. La adopción de dispositivos móviles está creciendo rápidamente. De acuerdo al <a href="http://www.gartner.com/it/page.jsp?id=1278413">estudio reciente de Gartner</a> dentro de los siguientes dos años tú podrás ver más personas visitando tu sitio web en un teléfono o tableta en vez de utilizar una computadora tradicional, con un potencial de 1.82 millones de dispositivos móviles en uso para el 2013. </p>
<p>La meta de jQuery Mobile es permitir ejecutar el framework en tantos dispositivos móviles como sea posible. En los Estados Unidos tenemos la atención en Smartphones iOS y Android. Sin embargo, fuera de los Estados Unidos, otros proveedores, como Nokia, son dominantes. Para este fin, jQuery Mobile trabajara en un amplio conjunto de dispositivos. En el lanzamiento de jQuery Mobile, en Septiembre de 2010, John Resig, el autor de jQuery, reveló una <a href="http://jquerymobile.com/gbs/">gráfica </a>que listaba los sistemas operativos móviles más populares (Ver Figura 1). Para cada sistema asignó una letra A, B o C determinando si la importancia de soportar el SO fue Alta (A), Media (B) o Baja (C).</p>
<p><a href="http://activ.com.mx/introduccion-a-jquery-mobile/fig01-9/" rel="attachment wp-att-5235"><img src="http://activ.com.mx/wp-content/uploads/2013/01/fig01.jpg" alt="Gráfica Sistemas Operativos para Moviles" width="380" height="285" class="aligncenter size-full wp-image-5235" /></a></p>
<p>Una indicación de cómo esta cambiando el mundo móvil, está tabla, probablemente sea elaborada nuevamente debido al cambio radical: Nokia esta matando a la Plataforma Symbian y reemplazándolo con Windows Mobile Phone 7. En un solo movimiento, Windows Mobile Phone 7 ha pasado de ser irrelevante a un estatus alto (A).</p>
<p>Para apoyar tus necesidades de desarrollo móvil, jQuery Mobile emplea una filosofía llamada mejora progresiva. En sus raíces, la mejora progresiva significa: Empieza con un marcado HTML semántico estático, que deberá funcionar en todos los navegadores. Agrega sus comportamientos y mejoras. Esto asegura que el contenido de la página y la funcionalidad básica de HTML es todavía accesible a navegadores menos capaces.</p>
<p>El desafío con los navegadores móviles es un verdadero problema. Por un lado tienes navegadores con fantásticas características (como navegadores web de Android, BlackBerry 6 y iOS Mobile Safari) que son todas las variaciones de WebKit -un motor de renderizado que impulsa a muchos navegadores como Google Chrome y la versión de Apple Safari-. (WebKit no conoce nada sobre la carga de las cosas fuera de la red. No conoce nada acerca de eventos de sistemas operativo nativo. No conoce nada acerca del desplazamiento. Cada sistema operativo, navegador o proveedor de dispositivo, necesita construir un navegador sobre ese motor para proporcionar estas cosas.) Entonces tienes millones de teléfonos Nokia Symbian o Windows Mobile 6 y anteriores que han fragmentado los estándares de soporte web. Para agregar al reto, hay diferentes versiones de WebKit usando en los diferentes sistemas operativos móviles. La conclusión es que, la mejora progresiva es un modelo que permite mostrar tu contenido en cualquiera de los dispositivos móviles soportados. </p>
<h2>Introducción </h2>
<p>El primer paso para empezar a utilizar jQuery Mobile es configurar una página web. Dentro del elemento HEAD debes referenciar los archivos de CSS jQuery Mobile y JavaScript:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="html" style="font-family:monospace;">&lt;link rel=&quot;stylesheet&quot; href=&quot;http://code.jquery.com/mobile/1.0a4.1/jquery.mobile-1.0a4.1.min.css&quot; /&gt;
&lt;script src=&quot;http://code.jquery.com/jquery-1.5.min.js&quot;&gt;&lt;/script&gt;
&lt;script src=&quot;http://code.jquery.com/mobile/1.0a4.1/jquery.mobile-1.0a4.1.min.js&quot;&gt;&lt;/script&gt;</pre></td></tr></table></div>

<p>Como puedes ver en los archivos de script, jQuery Mobile se está extendiendo la biblioteca principal de jQuery. Para los observadores de los recursos, el actual tamaño del archivo minimizado de jQuery Mobile es de 12kb.</p>
<p>El enlace de arriba apunta directamente a las versiones de CDM alojadas en los servidores de jQuery. El vínculo CSS también contiene referencias a los archivos gráficos que se necesitan. Si quieres descargar y almacenar los archivos de manera local yo necesitaras ir a la siguiente dirección Web:</p>
<p><a href="http://code.jquery.com/mobile/1.0a4.1/jquery.mobile-1.0a4.1.zip">http://code.jquery.com/mobile/1.0a4.1/jquery.mobile-1.0a4.1.zip</a></p>
<p>Descarga y extrae el archivo ZIP. Dentro de la carpeta encontrarás versiones comprimidas y sin comprimir de los archivos CSS y JavaScript, junto con una subcarpeta que contiene diez imágenes que se utilizan en el documento CSS.</p>
<p><a href="http://activ.com.mx/introduccion-a-jquery-mobile/fig02-10/" rel="attachment wp-att-5236"><img src="http://activ.com.mx/wp-content/uploads/2013/01/fig02.jpg" alt="Plantilla de jQuery" width="380" height="285" class="aligncenter size-full wp-image-5236" /></a><br />
Necesitarás utilizar tres áreas básicas de contenido en la página web donde vas a crear tu primer sitio con jQuery Mobile. La siguiente es una sugerencia de plantilla que puedes utilizar para futuros proyectos.</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="html" style="font-family:monospace;">&lt;!DOCTYPE html&gt; 
  &lt;html&gt; 
  &lt;head&gt;
     &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, minimum-scale=1, maximum-scale=1&quot;&gt;
     &lt;title&gt;Page Title&lt;/title&gt; 
     &lt;link rel=&quot;stylesheet&quot; href=&quot;http://code.jquery.com/mobile/1.0a4.1/jquery.mobile-1.0a4.1.min.css&quot; /&gt;
     &lt;script src=&quot;http://code.jquery.com/jquery-1.5.min.js&quot;&gt;&lt;/script&gt;
     &lt;script src=&quot;http://code.jquery.com/mobile/1.0a4.1/jquery.mobile-1.0a4.1.min.js&quot;&gt;&lt;/script&gt;
  &lt;/head&gt; 
&lt;body&gt; 
&lt;div data-role=&quot;page&quot;&gt;
  &lt;div data-role=&quot;header&quot;&gt;
     &lt;h1&gt;Page Title&lt;/h1&gt;
  &lt;/div&gt;&lt;!-- /header --&gt;
  &lt;div data-role=&quot;content&quot;&gt;
     &lt;p&gt;Page content goes here.&lt;/p&gt;
  &lt;/div&gt;&lt;!-- /content --&gt;
  &lt;div data-role=&quot;footer&quot;&gt;
     &lt;h4&gt;Page Footer&lt;/h4&gt;
  &lt;/div&gt;&lt;!-- /header --&gt;
  &lt;/div&gt;&lt;!-- /page --&gt;
&lt;/body&gt;</pre></td></tr></table></div>

<p>Hay un par de cosas que vale la pena destacar en esta plantilla. La primera es el uso del elemento DIV. Con HTML5 son tan comunes en los dispositivos móviles ¿Por qué no utilizar los nuevos elementos HEADER, ARTICLE,SECTION o FOOTER? Los antiguos navegadores no entienden los nuevos elementos HTML5. En algunos casos, como en las anteriores versiones de Internet Explorer en Windows Phone, hay un bug que primero requiere crear, mediante la programación un elemento (que no es HTML) en la etiqueta antes de que pueda ser estilizado. La etiqueta DIV es, sin embargo, soportada universalmente.</p>
<p>Puedes guardar la página web y probar en tu navegador. El código es HTML y trabaja en tu computadora de escritorio. Recomiendo usar Chrome para ejecutar las pruebas locales cuando quieras validar que el código HTML/JavaScript funcione correctamente. Para las pruebas de calidad necesitaras ejecutar las páginas web en diferentes dispositivos móviles.</p>
<h3>Crear páginas en un sitio móvil usando enlaces</h3>
<p>Una diferencia entre el estándar de las páginas web y páginas web móviles es la cantidad de contenido que se puede colocar en la pantalla. Sí, se puede cargar el sitio del New York Time en tu iPhone, pero necesitas hacer zoom para leer el contenido. Una buena solución es reducir el desorden de la página, hacia abajo del contenido que deseas presentar.</p>
<p>Para un sitio web tradicional se tendrían que crear muchas páginas web diferentes con un pequeña carga de contenido en cada una. Pero cuando estas utilizando jQuery, se puede resolver el problema de micro-contenido.</p>
<p>Arriba se muestra como crear una página repetitiva con jQuery Mobile. Llevaremos esto, un paso más allá y crearemos &ldquo;páginas&rdquo; de contenido. Una página puede estar estructurada como un bloque DIV en jQuery Mobile. Reemplaza el contenido dentro del elemento BODY utilizando la plantilla de abajo. Se agregara  un menú que enlaza a cuatro páginas diferentes. La primer página contiene un menú con enlaces (Ver Figura 3):</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="html" style="font-family:monospace;">&lt;!-- Start of first page --&gt;
&lt;div data-role=&quot;page&quot; id=&quot;menu&quot;&gt;
  &lt;div data-role=&quot;header&quot;&gt;
     &lt;h1&gt;Menu&lt;/h1&gt;
  &lt;/div&gt;&lt;!-- /header --&gt;
  &lt;div data-role=&quot;content&quot;&gt;   
     &lt;p&gt;What vehicles do you like?&lt;/p&gt;      
     &lt;p&gt;&lt;a href=&quot;#Cars&quot;&gt;Cars&lt;/a&gt;&lt;/p&gt;
     &lt;p&gt;&lt;a href=&quot;#Trains&quot;&gt;Trains&lt;/a&gt;&lt;/p&gt;
     &lt;p&gt;&lt;a href=&quot;#Planes&quot;&gt;Planes&lt;/a&gt;&lt;/p&gt;      
  &lt;/div&gt;&lt;!-- /content --&gt;
  &lt;div data-role=&quot;footer&quot;&gt;
     &lt;h4&gt;Page Footer&lt;/h4&gt;
  &lt;/div&gt;&lt;!-- /footer --&gt;
&lt;/div&gt;&lt;!-- /page --&gt;</pre></td></tr></table></div>

<p><a href="http://activ.com.mx/introduccion-a-jquery-mobile/fig03-10/" rel="attachment wp-att-5237"><img src="http://activ.com.mx/wp-content/uploads/2013/01/fig03.jpg" alt="Página con menú con enlaces" width="380" height="285" class="aligncenter size-full wp-image-5237" /></a><br />
Figura 3</p>
<p>La parte importante de este bloque HTML es el primer DIV. Dentro del elemento hay una propiedad de ID y DATA-ROLE: </p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="html" style="font-family:monospace;">data-role=&quot;page&quot; id=&quot;menu&quot;</pre></td></tr></table></div>

<p>El data-role define el contenido dentro del elemento DIV como una &ldquo;página&rdquo;. El término es un poco engañoso ya que &ldquo;página&rdquo; es un panel o pantalla en el código HTML y no una página separada. La instrucción data-role=&rdquo;page&rdquo; construye el contenido visible en la pantalla alrededor de los elementos DIV. El ID permite enlazar las secciones utilizando enlaces HREF.</p>
<p>El menú es la primer página por lo cual será la primera página en mostrarse en el navegador. Hay tres páginas adicionales que puedes agregar. Cada una tiene un ID diferente: Cars, Planes, Trains.</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="html" style="font-family:monospace;">&lt;!-- Start of second page --&gt;
&lt;div data-role=&quot;page&quot; id=&quot;Cars&quot;&gt;
  &lt;div data-role=&quot;header&quot;&gt;
     &lt;h1&gt;Cars&lt;/h1&gt;
  &lt;/div&gt;&lt;!-- /header --&gt;
  &lt;div data-role=&quot;content&quot;&gt;   
     &lt;p&gt;We can add a list of cars&lt;/p&gt;
  &lt;/div&gt;&lt;!-- /content --&gt;
  &lt;div data-role=&quot;footer&quot;&gt;
     &lt;h4&gt;Page Footer&lt;/h4&gt;
  &lt;/div&gt;&lt;!-- /footer --&gt;
&lt;/div&gt;&lt;!-- /page --&gt;
&lt;!-- Start of third page --&gt;
&lt;div data-role=&quot;page&quot; id=&quot;Trains&quot;&gt;
  &lt;div data-role=&quot;header&quot;&gt;
     &lt;h1&gt;Trains&lt;/h1&gt;
  &lt;/div&gt;&lt;!-- /header --&gt;
  &lt;div data-role=&quot;content&quot;&gt;   
     &lt;p&gt;We can add a list of trains&lt;/p&gt;
  &lt;/div&gt;&lt;!-- /content --&gt;
  &lt;div data-role=&quot;footer&quot;&gt;
     &lt;h4&gt;Page Footer&lt;/h4&gt;
  &lt;/div&gt;&lt;!-- /footer --&gt;
&lt;/div&gt;&lt;!-- /page --&gt;
&lt;!-- Start of fourth page --&gt;
&lt;div data-role=&quot;page&quot; id=&quot;Planes&quot;&gt;
  &lt;div data-role=&quot;header&quot;&gt;
     &lt;h1&gt;Planes&lt;/h1&gt;
&lt;/div&gt;&lt;!-- /header --&gt;
  &lt;div data-role=&quot;content&quot;&gt;   
     &lt;p&gt;We can add a list of planes&lt;/p&gt;
  &lt;/div&gt;&lt;!-- /content --&gt;
  &lt;div data-role=&quot;footer&quot;&gt;
  &lt;h4&gt;Page Footer&lt;/h4&gt;
&lt;/div&gt;&lt;!-- /footer --&gt;
&lt;/div&gt;&lt;!-- /page --&gt;</pre></td></tr></table></div>

<p>Prueba la página en tu dispositivo Android o iOS. Cuando cargue la página Web obtendrás tres cosas:</p>
<ul>
<li>
<p>El menú carga como si fuera una página propia (puedes intentar desplazarla pero no observarás algo más).</p>
</li>
<li>
<p>Cuando seleccionas un enlace, la página cambia con una animación que te lleva la nueva sección.</p>
</li>
<li>
<p>Cuando te mueves fuera de la página del menú automáticamente aparecerá un botón de retroceso en la cabecera del DIV.</p>
</li>
</ul>
<p>Cada uno de estos elementos DIV se cargaran dentro del navegador y parecerán páginas web separadas. El movimiento entre las pantallas es fluido.</p>
<p>La recomendación de crear múltiples pantallas de contenido en una página te permitirá reducir el tiempo de carga de la página. Puedes enlazar páginas web externas, sin embargo, con la siguiente advertencia: Los enlaces en jQuery Mobile son tratados como llamadas a AJAX. Los enlaces de una página de jQuery Mobile toman ventaja de las transiciones de CSS al cambiar las pantallas. Cuando quieres enlazar una página que está fuera de la aplicación necesitaras forzar la creación de un nuevo documento y reemplazar los archivos actuales de jQuery Mobile. Esto se muestra en el siguiente ejemplo:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="html" style="font-family:monospace;">&lt;a href=&quot;http://www.madinc.co&quot; rel=&quot;external&quot;&gt;madinc.co&lt;/a&gt;</pre></td></tr></table></div>

<p>Necesitas incluir la propiedad y el valor rel=&rdquo;external&rdquo;. Esto te permite enlazar una página web fuera de los enlaces locales que se están utilizando. Sin embargo, jQuery Mobile tiene un paso extra. En lugar de sólo tratar a los enlaces externos como un enlace fuera de tu sitio, jQuery Mobile aplicará una animación en la transición de página. En lugar de tener todo tu contenido en una sola página, puedes dividir el contenido en muchas páginas para construir mejores soluciones.</p>
<h2>Trabajar con componentes </h2>
<p>Por supuesto, enlaces y paginas son solo un aparte del diseño web móvil. Un segundo reto que muchos desarrolladores de web móvil encaran, es la explosión de aplicaciones. A diferencia de las páginas web, las aplicaciones para Android, iOS y otros sistemas son construidos con tecnologías complejas como Objective-C, Java y C#. Estas tecnologías permiten a los desarrolladores añadir menús de herramientas, listas y otros controles, y componentes que no se encuentran en HTML. </p>
<p>Actualmente jQuery Mobile está disponible con una selección de componentes. Los siguientes componentes están incluidos en la versión alfa:</p>
<ul>
<li>
<p>Páginas.</p>
</li>
<li>
<p>Cajas de Diálogo.</p>
</li>
<li>
<p>Barras de Herramientas</p>
</li>
<li>
<p>Botones.</p>
</li>
<li>
<p>Formato de Contenido.</p>
</li>
<li>
<p>Elementos de Formulario.</p>
</li>
<li>
<p>Listas.</p>
</li>
</ul>
<p>Agregar y cambiar un componente no es muy difícil. Si sabes un poco de HTML, entonces vas por buen camino. Revisemos los componentes de una página. </p>
<h3>Agregar cabeceras y pies de página</h3>
<p>El ejemplo anterior demuestra cómo puedes agregar barras de herramientas como cabeceras y pies de página. Las barras de herramientas a menudo son las más difícil de controlar cuando se crea contenido para diferentes pantallas. El reto llega al colocar contenido que se escale dinámicamente para diferentes tamaños de pantalla por ejemplo, una barra de herramientas en el HEADER puede contener un botón (botón de retroceso). Utilizando jQuery Mobile el HEADER te permitirá agregar un título que permanezca en el centro con un botón a la izquierda o a la derecha sin importar que tan grande sea la pantalla.</p>
<p>El siguiente código crea un header con dos botones (Figura 4):</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="html" style="font-family:monospace;">&lt;div data-role=&quot;header&quot; data-position=&quot;inline&quot;&gt;
  &lt;a href=&quot;cancel.html&quot; data-icon=&quot;delete&quot;&gt;Cancel&lt;/a&gt;
  &lt;h1&gt;Edit Contact&lt;/h1&gt;
  &lt;a href=&quot;save.html&quot; data-icon=&quot;check&quot;&gt;Save&lt;/a&gt;
&lt;/div&gt;</pre></td></tr></table></div>

<p><a href="http://activ.com.mx/introduccion-a-jquery-mobile/fig04-6/" rel="attachment wp-att-5238"><img src="http://activ.com.mx/wp-content/uploads/2013/01/fig04.jpg" alt="Barra de herramientas con dos botones" width="380" height="285" class="aligncenter size-full wp-image-5238" /></a><br />
Figura 4</p>
<p>La posición de los botones esta definida por el orden del contenido. El resultado es una página web móvil con un título centrado con botones a la izquierda y a la derecha que lucen y funcionan consistentemente en diferentes dispositivos.</p>
<p>Las cabeceras y los pies de página también pueden ser personalizados como herramientas de navegación. Se pueden agregar botones interactivos al pie de página que te llevaran a las secciones de la pantalla. Esto se logra con un data-role=&rdquo;navbar&rdquo;:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="html" style="font-family:monospace;">&lt;div data-role=&quot;navbar&quot;&gt;
  &lt;ul&gt;
     &lt;li&gt;&lt;a href=&quot;#nav1&quot; class=&quot;ui-btn-active&quot;&gt;One&lt;/a&gt;&lt;/li&gt;
     &lt;li&gt;&lt;a href=&quot;#nav2&quot;&gt;Two&lt;/a&gt;&lt;/li&gt;
  &lt;/ul&gt;
&lt;/div&gt;&lt;!-- /navbar --&gt;</pre></td></tr></table></div>

<p>De nuevo, puedes ver que con la mayoría del código jQuery Mobile, el navbar es construido con una simple lista HTML envuelto en una etiqueta DIV. Las propiedades, como ui-btn-active pueden ser establecidas para identificar a un botón que debería ser seleccionado. </p>
<p>Cuando seleccionas un botón y cambias a una segunda pantalla dentro de la misma página, jQuery Mobile es lo suficientemente listo para agregar automáticamente un botón de retroceso en el header. Por ejemplo, el siguiente código HTML agrega tres pantallas en una página de HTML. Esta la pantalla principal y dos pantallas de ejemplo a las que se pueden enlazar desde la navbar. Agrega el código y ve como se agregan los botones de retroceso automáticamente. </p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="html" style="font-family:monospace;">&lt;div data-role=&quot;page&quot;&gt;
  &lt;div data-role=&quot;header&quot;&gt;
     &lt;h1&gt;Navigation&lt;/h1&gt;
  &lt;/div&gt;&lt;!-- /header --&gt;
&lt;div data-role=&quot;content&quot;&gt;   
Navigation page   
&lt;/div&gt;&lt;!-- /content --&gt;
  &lt;div data-role=&quot;footer&quot;&gt;
  &lt;div data-role=&quot;navbar&quot;&gt;
     &lt;ul&gt;
        &lt;li&gt;&lt;a href=&quot;#nav1&quot; class=&quot;ui-btn-active&quot;&gt;One&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href=&quot;#nav2&quot;&gt;Two&lt;/a&gt;&lt;/li&gt;
     &lt;/ul&gt;
  &lt;/div&gt;&lt;!-- /navbar --&gt;
&lt;/div&gt;&lt;!-- /footer --&gt;
&lt;/div&gt;&lt;!-- /page --&gt;
&lt;div data-role=&quot;page&quot; id=&quot;nav1&quot;&gt;
  &lt;div data-role=&quot;header&quot;&gt;
     &lt;h1&gt;Nav Screen 1&lt;/h1&gt;
  &lt;/div&gt;&lt;!-- /header --&gt;
  &lt;div data-role=&quot;content&quot;&gt;   
Screen for Navigation One   &lt;/div&gt;&lt;!-- /content --&gt;
  &lt;div data-role=&quot;footer&quot;&gt;
&lt;h4&gt;Additional Footer information&lt;/h4&gt;
  &lt;/div&gt;&lt;!-- /footer --&gt;
&lt;/div&gt;&lt;!-- /page --&gt;
&lt;div data-role=&quot;page&quot; id=&quot;nav2&quot;&gt;
  &lt;div data-role=&quot;header&quot;&gt;
     &lt;h1&gt;Nav Screen 2&lt;/h1&gt;
  &lt;/div&gt;&lt;!-- /header --&gt;
  &lt;div data-role=&quot;content&quot;&gt;   
Screen for Navigation Two
  &lt;/div&gt;&lt;!-- /content --&gt;
&lt;div data-role=&quot;footer&quot;&gt;
&lt;h4&gt;Additional Footer information&lt;/h4&gt;
&lt;/div&gt;&lt;!-- /footer --&gt;
&lt;/div&gt;&lt;!-- /page --&gt;</pre></td></tr></table></div>

<p>Recuerda agregar las referencias a jQuery Mobile.</p>
<h3>Hacer encabezados y pie de página persistentes </h3>
<p>Una técnica común de diseño de interfaces de usuario es mantener el header hasta arriba de la pantalla y el footer hasta abajo. Puedes utilizar jQuery Mobile para lograrlo, agregando data-position=&rdquo;fixed&rdquo;  a el header o al footer. Esto forzará a que el header se mantenga hasta arriba el footer hasta abajo, como en el siguiente ejemplo (Figura 5): </p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="html" style="font-family:monospace;">&lt;div data-role=&quot;page&quot;&gt;
  &lt;div data-role=&quot;header&quot; data-position=&quot;fixed&quot;&gt;
     &lt;h1&gt;Navigation&lt;/h1&gt;
  &lt;/div&gt;&lt;!-- /header --&gt;
  &lt;div data-role=&quot;content&quot; &gt;
     &lt;ul data-role=&quot;listview&quot; data-dividertheme=&quot;d&quot; style=&quot;margin-top: 0;&quot;&gt;
        &lt;li data-role=&quot;list-divider&quot;&gt;Royal Family&lt;/li&gt;
        &lt;li&gt;&lt;a href=&quot;#nav1&quot;&gt;Henry VIII&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href=&quot;#nav1&quot;&gt;George V&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href=&quot;#nav1&quot;&gt;Prince of Wales&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href=&quot;#nav1&quot;&gt;Elizabeth I&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href=&quot;#nav1&quot;&gt;Elizabeth II&lt;/a&gt;&lt;/li&gt;
        &lt;li data-role=&quot;list-divider&quot;&gt;Prime Miniseters&lt;/li&gt;
        &lt;li&gt;&lt;a href=&quot;#nav2&quot;&gt;Winston Churchill&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href=&quot;#nav2&quot;&gt;Tony Blare&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href=&quot;#nav2&quot;&gt;David Cameron&lt;/a&gt;&lt;/li&gt;
     &lt;/ul&gt;
  &lt;/div&gt;&lt;!-- /content --&gt;
&lt;div data-role=&quot;footer&quot; data-position=&quot;fixed&quot;&gt;
  &lt;div data-role=&quot;navbar&quot;&gt;
     &lt;ul&gt;
        &lt;li&gt;&lt;a href=&quot;#nav1&quot; class=&quot;ui-btn-active&quot;&gt;Royals&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href=&quot;#nav2&quot;&gt;Leaders&lt;/a&gt;&lt;/li&gt;
     &lt;/ul&gt;
  &lt;/div&gt;&lt;!-- /navbar --&gt;
&lt;/div&gt;&lt;!-- /footer --&gt;
&lt;/div&gt;&lt;!-- /page --&gt;
&lt;div data-role=&quot;page&quot; id=&quot;nav1&quot; data-position=&quot;fixed&quot;&gt;
  &lt;div data-role=&quot;header&quot;&gt;
     &lt;h1&gt;Royal Family&lt;/h1&gt;
  &lt;/div&gt;&lt;!-- /header --&gt;
&lt;div data-role=&quot;content&quot;&gt;
&lt;p&gt;Members and relatives of the British Royal Family historically represented the monarch in various places throughout the British Empire, sometimes for extended periods as viceroys, or for specific ceremonies or events. Today, they often perform ceremonial and social duties throughout the United Kingdom and abroad on behalf of the UK, but, aside from the monarch, have no constitutional role in the affairs of government. This is the same for the other realms of the Commonwealth though the family there acts on behalf of, is funded by, and represents the sovereign of that particular state, and not the United Kingdom.&lt;/P&gt;
&lt;/div&gt;&lt;!-- /content --&gt;
  &lt;div data-role=&quot;footer&quot; data-position=&quot;fixed&quot;&gt;
     &lt;h4&gt;Royal Family&lt;/h4&gt;
  &lt;/div&gt;&lt;!-- /header --&gt;
&lt;/div&gt;&lt;!-- /page --&gt;
&lt;div data-role=&quot;page&quot; id=&quot;nav2&quot; data-position=&quot;fixed&quot;&gt;
  &lt;div data-role=&quot;header&quot;&gt;
     &lt;h1&gt;Prime Ministers&lt;/h1&gt;
  &lt;/div&gt;&lt;!-- /header --&gt;
&lt;div data-role=&quot;content&quot;&gt;
The Prime Minister of the United Kingdom of Great Britain and Northern Ireland is the Head of Her Majesty's Government in the United Kingdom. The Prime Minister and Cabinet (consisting of all the most senior ministers, who are government department heads) are collectively accountable for their policies and actions to the Sovereign, to Parliament, to their political party and ultimately to the electorate. The current Prime Minister, David Cameron, was appointed on 11 May 2010.&lt;/div&gt;&lt;!-- /content --&gt;
&lt;div data-role=&quot;footer&quot; data-position=&quot;fixed&quot;&gt;
  &lt;h4&gt;Prime Minister&lt;/h4&gt;
     &lt;/div&gt;&lt;!-- /header --&gt;
  &lt;/div&gt;&lt;!-- /page --&gt;</pre></td></tr></table></div>

<p><a href="http://activ.com.mx/introduccion-a-jquery-mobile/fig05-6/" rel="attachment wp-att-5239"><img src="http://activ.com.mx/wp-content/uploads/2013/01/fig05.jpg" alt="Encabezado y Pie de Página" width="380" height="285" class="aligncenter size-full wp-image-5239" /></a><br />
Figura 5</p>
<p>Ahora, sin utilizar Objective-C puedes agregar header y footers fijos.</p>
<h3>Trabajar con cajas de diálogo</h3>
<p>El componente page también permite agregar cajas de diálogo personalizadas utilizando la propiedad data-rel. Por ejemplo, el siguiente código cargará un página web dentro de una caja de diálogo:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="html" style="font-family:monospace;">&lt;a href=&quot;dialog.html&quot; data-rel=&quot;dialog&quot;&gt;Open dialog&lt;/a&gt;</pre></td></tr></table></div>

<p>Utilizar este método te permite cargar cualquier mensaje personalizado dentro de la caja de diálogo. </p>
<p>Se necesitan dos secciones para una caja de diálogo cuando se posiciona cuna caja de diálogo en la misma página. Curiosamente, una caja de diálogo no es diferente de una pantalla. Con este conocimiento, puedes agregar puede agregar cualquier tipo de HTML dentro de una caja de diálogo. esta primera sección muestra un enlace a la caja de diálogo como se muestra:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="html" style="font-family:monospace;">&lt;div data-role=&quot;page&quot;&gt;
  &lt;div data-role=&quot;header&quot;&gt;
     &lt;h1&gt;Dialog Box&lt;/h1&gt;
  &lt;/div&gt;&lt;!-- /header --&gt;
&lt;div data-role=&quot;content&quot;&gt;   
  &lt;a href=&quot;#dialogPopUp&quot; data-rel=&quot;dialog&quot; data-role=&quot;button&quot;&gt;Open dialog&lt;/a&gt; 
&lt;/div&gt;&lt;!-- /content --&gt;
&lt;div data-role=&quot;footer&quot;&gt;
  &lt;h4&gt;Page Footer&lt;/h4&gt;
&lt;/div&gt;&lt;!-- /footer --&gt;
&lt;/div&gt;&lt;!-- /page --&gt;</pre></td></tr></table></div>

<p>Puedes ver en el HREF del botón que hay un enlace o una sección local. La siguiente página aparecerá en la caja de diálogo:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="html" style="font-family:monospace;">&lt;div data-role=&quot;page&quot; id=&quot;dialogPopUp&quot;&gt;
  &lt;div data-role=&quot;header&quot;&gt;
     &lt;h1&gt;Dialog Title&lt;/h1&gt;
  &lt;/div&gt;&lt;!-- /header --&gt;
  &lt;div data-role=&quot;content&quot;&gt;   
     This is a dialog box      
  &lt;/div&gt;&lt;!-- /content --&gt;
&lt;div data-role=&quot;footer&quot;&gt;
&lt;h4&gt;Additional Footer information&lt;/h4&gt;
&lt;/div&gt;&lt;!-- /footer --&gt;
&lt;/div&gt;&lt;!-- /page --&gt;</pre></td></tr></table></div>

<p>La inclusión del footer en la página es opcional, pero debe incluir el header. Sin el header, no aparecerá automáticamente un botón de cerrar.</p>
<h3>Listas</h3>
<p>Hay muchos datos en la Web. Las listas son eficaces herramientas que puedes utilizar para administrar grandes cantidades de datos. Ya habíamos utilizado las listas en ejemplos anteriores, pero ahora es el momento de empaparse de ellas:<br />
Aquí está una lista simple utilizando el estándar HTML:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="html" style="font-family:monospace;">&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;#nav1&quot;&gt;Henry VIII&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#nav1&quot;&gt;George V&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#nav1&quot;&gt;Prince of Wales&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#nav1&quot;&gt;Elizabeth I&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#nav1&quot;&gt;Elizabeth II&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</pre></td></tr></table></div>

<p>En jQuery Mobile puedes convertir esta lista simple en una magnífica. El atributo data-role le dirá a jQuery Mobile que redibuje la lista con una mejor vista y rendimiento como si se tratara de una aplicación nativa:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="html" style="font-family:monospace;">&lt;ul data-role=&quot;listview&quot;&gt;
  &lt;li&gt;&lt;a href=&quot;#nav1&quot;&gt;Henry VIII&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#nav1&quot;&gt;George V&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#nav1&quot;&gt;Prince of Wales&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#nav1&quot;&gt;Elizabeth I&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#nav1&quot;&gt;Elizabeth II&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</pre></td></tr></table></div>

<p><a href="http://activ.com.mx/introduccion-a-jquery-mobile/fig06-3/" rel="attachment wp-att-5240"><img src="http://activ.com.mx/wp-content/uploads/2013/01/fig06.jpg" alt="Lista Básica " width="380" height="285" class="aligncenter size-full wp-image-5240" /></a><br />
Figura 6 </p>
<p>Eso es todo, solo 20 caracteres y tienes una lista con formato.</p>
<p>Fuera de la lista básica, jQuery te da la opción de extender la lista básica. Por ejemplo, el siguiente será añadir divisores a las listas (Figura 7):</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="html" style="font-family:monospace;">&lt;ul data-role=&quot;listview&quot; data-dividertheme=&quot;d&quot;&gt;
  &lt;li data-role=&quot;list-divider&quot;&gt;Royal Family&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#home&quot;&gt;Henry VIII&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#home&quot;&gt;George V&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#home&quot;&gt;Prince of Wales&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#home&quot;&gt;Elizabeth I&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#home&quot;&gt;Elizabeth II&lt;/a&gt;&lt;/li&gt;
  &lt;li data-role=&quot;list-divider&quot;&gt;Prime Ministers&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#home&quot;&gt;Winston Churchill&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#home&quot;&gt;Tony Blare&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#home&quot;&gt;David Cameron&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</pre></td></tr></table></div>

<p><a href="http://activ.com.mx/introduccion-a-jquery-mobile/fig07-2/" rel="attachment wp-att-5241"><img src="http://activ.com.mx/wp-content/uploads/2013/01/fig07.jpg" alt="Lista con Divisiones " width="380" height="285" class="aligncenter size-full wp-image-5241" /></a><br />
Figura 7</p>
<p>Puedes agregar separadores(divider) incluyendo el atributo data-divider al inicio del elemento li  e incluyendo un elemento especial de la lista donde quieras que aparezca el separador.</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="html" style="font-family:monospace;">(&lt;li data-role=&quot;list-divider&quot;&gt;Royal Family &lt;/li&gt;)</pre></td></tr></table></div>

<p>Las burbujas de datos también pueden agregarse a casa elemento de la lista. En el ejemplo siguiente el reinado de cada miembro de la Familia Real Británica es agregado a una burbuja (Ver Figura 8).</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="html" style="font-family:monospace;">&lt;ul data-role=&quot;listview&quot; style=&quot;margin-top: 0;&quot;&gt;
  &lt;li&gt;&lt;a href=&quot;#nav1&quot;&gt;Henry VIII &lt;span class=&quot;ui-li-count&quot;&gt;Reign 37 Years&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#nav1&quot;&gt;George V &lt;span class=&quot;ui-li-count&quot;&gt;Reign 25 Years&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#nav1&quot;&gt;Prince of Wales &lt;span class=&quot;ui-li-count&quot;&gt;N/A&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#nav1&quot;&gt;Elizabeth I &lt;span class=&quot;ui-li-count&quot;&gt;Reign 44 Years&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#nav1&quot;&gt;Elizabeth II&lt;span class=&quot;ui-li-count&quot;&gt;Reign since 1952&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</pre></td></tr></table></div>

<p><a href="http://activ.com.mx/introduccion-a-jquery-mobile/fig08/" rel="attachment wp-att-5242"><img src="http://activ.com.mx/wp-content/uploads/2013/01/fig08.jpg" alt="Lista con data bubbles" width="380" height="285" class="aligncenter size-full wp-image-5242" /></a><br />
Figura 8</p>
<p>Un tipo de lista adicional es una lista compleja donde puedes agregar enlaces, imágenes, y texto dentro de un elemento lista(li). Aquí hay un ejemplo:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="html" style="font-family:monospace;">&lt;ul data-role=&quot;listview&quot; style=&quot;margin-top: 0;&quot;&gt;
  &lt;li&gt;
     &lt;img src=&quot;http://img.freebase.com/api/trans/image_thumb/en/henry_viii_of_england?pad=1&amp;errorid=%2Ffreebase%2Fno_image_png&amp;maxheight=64&amp;mode=fillcropmid&amp;maxwidth=64&quot; /&gt;
     &lt;h3&gt;&lt;a href=&quot;index.html&quot;&gt;Henry VIII&lt;/a&gt;&lt;/h3&gt;
     &lt;p&gt;Reign 37 Years&lt;/p&gt;
     &lt;a href=&quot;#home&quot;&gt;Details&lt;/a&gt;
  &lt;/li&gt;
  &lt;li&gt;
     &lt;img src=&quot;http://www.iwise.com/authorIcons/15/King_George%20V_64x64.png&quot; /&gt;
     &lt;h3&gt;&lt;a href=&quot;index.html&quot;&gt;George V&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Reign 25 Years&lt;/p&gt;
     &lt;a href=&quot;#home&quot;&gt;Details&lt;/a&gt;
  &lt;/li&gt;
  &lt;li&gt;
     &lt;img src=&quot;http://img.freebase.com/api/trans/image_thumb/en/prince_of_wales_secondary_school?pad=1&amp;errorid=%2Ffreebase%2Fno_image_png&amp;maxheight=64&amp;mode=fillcropmid&amp;maxwidth=64&quot; /&gt;
     &lt;h3&gt;&lt;a href=&quot;index.html&quot;&gt;Prince of Wales&lt;/a&gt;&lt;/h3&gt;
     &lt;p&gt;Reign N/A&lt;/p&gt;
     &lt;a href=&quot;#home&quot;&gt;Details&lt;/a&gt;
  &lt;/li&gt;
  &lt;li&gt;
  &lt;img src=&quot;http://www.iwise.com/authorIcons/13846/Elizabeth%20I%20of%20England_64x64.png&quot; /&gt;
     &lt;h3&gt;&lt;a href=&quot;index.html&quot;&gt;Elizabeth I&lt;/a&gt;&lt;/h3&gt;
     &lt;p&gt;Reign 44 Years&lt;/p&gt;
     &lt;a href=&quot;#home&quot;&gt;Details&lt;/a&gt;
  &lt;/li&gt;
  &lt;li&gt;
     &lt;img src=&quot;http://www.iwise.com/authorIcons/9098/Elizabeth%20II_64x64.png&quot; /&gt;
     &lt;h3&gt;&lt;a href=&quot;index.html&quot;&gt;Elizabeth II&lt;/a&gt;&lt;/h3&gt;
     &lt;p&gt;Reign Since 1952&lt;/p&gt;
     &lt;a href=&quot;#home&quot;&gt;Details&lt;/a&gt;
  &lt;/li&gt;
&lt;/ul&gt;</pre></td></tr></table></div>

<p>Este tipo de lista es útil cuando necesitas comunicar muchos datos. Por ejemplo, podrías querer una lista de los estudiantes en clase, con su nombre, fotografía y GPA. El resultado final es que tienes una lista de desplazamiento que luce complicada crear solo con HTML.</p>
<h2>Publicar tu sitio web con jQuery Mobile</h2>
<p>Cuando has completado el desarrollo de tu sitio jQuery Mobile te queda una tarea final: Implementar los archivos que el mundo podrá ver.</p>
<p>Al final del día, jQuery Mobile es una colección de archivos HTML, CSS y JavaScript. La implementación no es diferente de cuando se implementa un sitio estándar de HTML/CSS. Usando FTP o el administrador de sitios web de tu preferencia (como Dreamweaver) registrar los archivos al el servidor web. Asegúrate de que registrar todos los archivos JavaScript, CSS, y archivos de imagen.</p>
<p>Cuando los archivos están en el servidor puedes visitar el sitio utilizando un dispositivo móvil como BlackBerry, iPhone, Android o Windows Phone.</p>
<p>Al utilizar el enfoque de jQuery Mobile se hace la afirmación de que el sitio se centrará en los teléfonos inteligentes. Es posible que quieras considerar la creación de una identidad móvil completamente separada de tu sitio jQuery Mobile, si se trata de un sitio secundario a tu sitio web principal. Por ejemplo, tu sitio principal podría ser www.companyname.com mientras tu sitio jQuery Mobile puede ser m.companyname.com.</p>
<p>No hay manera correcta o incorrecta de cómo diferencia un sitio web dirigido a equipos de escritorio contra un sitio móvil. La única decisión correcta es asegurarte de que tienes un sitio web móvil para apoyar a tus clientes en la experiencia visual.</p>
<h2>A donde ir desde aquí</h2>
<p>La versión alfa actual de jQuery Mobile claramente ha necesitado mucho trabajo. Si has estado esperando a lanzarte al mundo de diseño web móvil entonces su espera ha terminado. jQuery Mobile te brinda un framework que que hace el desarrollo web móvil más fácil.</p>
<p>Para más información acerca de jQuery Mobile, revisa las siguientes referencias:</p>
<p><a href="http://tv.adobe.com/watch/cs-55-web-premium-feature-tour-/explore-how-to-use-jquery-to-make-designing-for-mobile-more-efficient/">Explora cómo usar jQuery para hacer diseño para móviles más eficiente </a></p>
<p><a href="http://www.adobe.com/devnet/dreamweaver/articles/theme-control-jquery-mobile.html">Usando y personalizando temas de jQuery Mobile</a></p>
<p>La versión original de este artículo está publicada en<a href="http://www.adobe.com/devnet/dreamweaver/articles/getting-started-with-jquery-mobile.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/introduccion-a-jquery-mobile/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tips para Proyectos Extensos de iOS con Flash</title>
		<link>http://activ.com.mx/tips-para-proyectos-extensos-de-ios-con-flash/</link>
		<comments>http://activ.com.mx/tips-para-proyectos-extensos-de-ios-con-flash/#comments</comments>
		<pubDate>Wed, 16 Jan 2013 15:19:14 +0000</pubDate>
		<dc:creator>jesus_macedo</dc:creator>
				<category><![CDATA[AIR]]></category>
		<category><![CDATA[Articulos]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[actionscript]]></category>
		<category><![CDATA[air]]></category>
		<category><![CDATA[articulos]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[flash builder]]></category>
		<category><![CDATA[ios]]></category>
		<category><![CDATA[mobile]]></category>

		<guid isPermaLink="false">http://activ.com.mx/?p=5217</guid>
		<description><![CDATA[Cuando se está haciendo desarrollo de juegos con Adobe AIR para Android o la tableta de BlackBerry, se pueden cargar archivos SWF al vuelo en tiempo de ejecución; con AIR para iOS, no hay tal opción. En Android o la tableta de BlackBerry el código es interpretado desde el bytecode de ActionScript, mientras que en [...]]]></description>
				<content:encoded><![CDATA[<p>Cuando se está haciendo desarrollo  de juegos con Adobe AIR para Android o la tableta de BlackBerry, se pueden  cargar archivos SWF al vuelo en tiempo de ejecución; con AIR para iOS, no hay tal  opción. En Android o la tableta de BlackBerry el código es interpretado desde  el bytecode de ActionScript, mientras que en iOS todo el código debe ser  compilado desde el bytecode de ActionScript a bytecode nativo como un solo  archivo IPA, el cual solo se puede crear desde un solo SWF.</p>
<p style="text-align:center"><img src="http://activ.com.mx/wp-content/uploads/2013/01/swcs.jpg" alt="SWF y SWC" width="380" height="238" /></p>
<p>Si el juego tiene docenas de  niveles y cada nivel es un SWF, compilar para iOS puede ser un reto. Cuando se está  en la programación de juegos y la fase de pruebas de desarrollo, se puede usar  ipa-test-interpreter para cambiar la configuración del compilador, y tu juego  se ejecutara como si lo hiciera en Android o en la tableta de BlackBerry. Sin  embargo, Apple no aceptara juegos construidos utilizando este enfoque, así que  se necesitara otro enfoque para la versión final.</p>
<p><span id="more-5217"></span></p>
<p>Una solución es compilar cada nivel  como una librería <a href="http://livedocs.adobe.com/flex/3/html/help.html?content=compilers_30.html">SWC</a>,  y entonces enlazar todos los SWC dentro de un solo archivo SWF.</p>
<h2>Crear un solo archivo SWF de SWCs</h2>
<p>Si estas usando Flash Builder, necesitaras usar un Flex  Library Project, el cual generara un archivo SWC, en vez de un proyecto de  ActionScript, cuyo archivo generado es un SWF.</p>
<p style="text-align:center"><img src="http://activ.com.mx/wp-content/uploads/2013/01/swc2.jpg" alt="Flash Builder" width="306" height="171" /></p>
<p>En Flash Professional CS5.5,  puedes usar una opción en la caja de dialogo de la Configuración de Publicación,  para generar un SWC en lugar de un SWF.</p>
<p style="text-align:center"><img src="http://activ.com.mx/wp-content/uploads/2013/01/swc3.jpg" alt="Flash Professional" width="380" height="139" /></p>
<h2>A donde ir desde aquí</h2>
<p>Cuando se usa la técnica descrita  en este artículo para el desarrollo de un juego para iOS, se necesitara instanciar  los nuevos niveles en tiempo de ejecución en lugar de cargarlos dinámicamente.  Recuerda, es posible cargar archivos SWF en iOS, pero el código dentro de estos  no será interpretado. Cargar un SWF de esta forma es útil para los recursos gráficos  como animaciones o gráficos vectoriales. Puedes crear una librería completa de símbolos  y simplemente seleccionar el símbolo que quieras utilizar.</p>
<p>Por último, nota que esta técnica  funciona para ActionScript 3.0, pero no para ActionScript 2.0.</p>
<p>Para información acerca de  combinar muchos SWFs dentro de un solo SWF, lee mi artículo <a href="http://www.adobe.com/devnet/flash/articles/join-multiple-swf-files.html">Uniendo  múltiples archivos SWF dentro de un SWF para su implementación en iOS</a>.</p>
<p>La versión original de este  artículo está publicada en <strong><a href="http://www.adobe.com/devnet/flash/articles/combine-swfs-with-swcs.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/tips-para-proyectos-extensos-de-ios-con-flash/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>Experimentos de CSS3 con Adobe FilterLab</title>
		<link>http://activ.com.mx/experimentos-de-css3-con-adobe-filterlab/</link>
		<comments>http://activ.com.mx/experimentos-de-css3-con-adobe-filterlab/#comments</comments>
		<pubDate>Mon, 10 Dec 2012 19:33:06 +0000</pubDate>
		<dc:creator>gr_maggi</dc:creator>
				<category><![CDATA[Adobe]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[Recursos]]></category>
		<category><![CDATA[adobe]]></category>
		<category><![CDATA[articulos]]></category>
		<category><![CDATA[css3]]></category>
		<category><![CDATA[diseño web]]></category>
		<category><![CDATA[html5]]></category>

		<guid isPermaLink="false">http://activ.com.mx/?p=5135</guid>
		<description><![CDATA[En Octubre del 2011, Adobe propuso CSS Shaders como una forma de traer efectos cinematográficos a la web. Efectos como saturation, gamma, burn, fold, curl e incluso dissolve y explode podrían aplicarse con CSS a los elementos HTML normales. Esa propuesta ha evolucionado. Se ha debatido abiertamente, actualizado y finalmente se fusionó con la especificación [...]]]></description>
				<content:encoded><![CDATA[<p>En Octubre del 2011, Adobe propuso <a href="http://www.adobe.com/devnet/html5/articles/css-shaders.html">CSS Shaders</a> como una forma de traer efectos cinematográficos a la web. Efectos como saturation, gamma, burn, fold, curl e incluso dissolve y explode podrían aplicarse con CSS a los elementos HTML normales. Esa propuesta ha evolucionado. Se ha debatido abiertamente, actualizado y finalmente se fusionó con la especificación de Efectos de Filtro CSS. Ahora está en camino a un navegador para estar cerca de ti. CSS Shaders ahora lleva el nombre de Filtros Personalizados CSS, que son igual de expresivos.</p>
<p style="text-align: center"><a href="http://html.adobe.com/webstandards/csscustomfilters/cssfilterlab/"><img src="http://activ.com.mx/wp-content/uploads/2012/12/css3_filterLab.jpg" alt="CSS3 Filter Lab" title="CSS3 Filter Lab" width="349" height="336" class="aligncenter size-full wp-image-5194" /></a></p>
<p><span id="more-5135"></span></p>
<h2>CSS FilterLab</h2>
<p><a href="http://html.adobe.com/webstandards/csscustomfilters/cssfilterlab/">CSS FilterLab</a> es una herramienta basada en el navegador que te permite jugar con los filtros CSS, modificarlos, y ver los efectos en tiempo real (Ver figura 1). Puedes usar la herramienta para combinar múltiples filtros y animarlos para crear efectos cinematográficos.</p>
<p style="text-align: center"><img src="http://activ.com.mx/wp-content/uploads/2012/12/fig01.jpg" alt="FilterLab" /></p>
<p style="text-align: center">Figura 1</p>
<p>En el momento de escribir, esto es realmente de última tecnología, así que solo unos pocos navegadores lo soportan. Así cuando abres CSS FilterLab en tu navegador, se mostrará un mensaje con las instrucciones sobre qué hacer para obtener la mejor experiencia. Tuvimos mucho cuidado para hacer que las instrucciones sean simples y fáciles de seguir.</p>
<h2>Para empezar</h2>
<p>Es fácil empezar a experimentar con CSS FilterLab. Una vez que abras el navegador, puedes empezar a añadir filtros desde el menú Añadir Filtro.</p>
<p>Puedes elegir aplicar filtros integrados o filtros personalizados:</p>
<ul>
<li>Filtros Integrados son los que vienen por defecto en el navegador. Contienen efectos de color básico como escala en grises, sepia, saturación o contraste.</li>
<li>Filtros Personalizados toman efectos a un nivel completamente nuevo. Algunos ejemplos que se han construido incluyen efectos como burn, curl, fold, dissolve, explode, y muchos más. Los filtros personalizados no vienen con los navegadores, sino que están escritos por los desarrolladores mismos. Ellos hacen uso de Shaders, que son pequeños programas que permiten un control preciso sobre el color y la geometría. Shaders toma ventaja de la aceleración de hardware y son comúnmente utilizados en los efectos visuales para juegos. Pueden parecer ajenos a los desarrolladores de CSS, y por lo general requieren un buen conocimiento de las matemáticas.</li>
</ul>
<p>Afortunadamente, CSS FilterLab viene con excelentes ejemplos de filtros personalizados con Shaders subyacentes. Un ejemplo es el doblez, que da a un elemento HTML el aspecto 3D de un pedazo de papel doblado (Ver Figura 2).</p>
<p style="text-align: center"><img src="http://activ.com.mx/wp-content/uploads/2012/12/fig021.jpg" alt="Filtros Personalizados" /></p>
<p style="text-align: center">Figura 2</p>
<p>Los filtros que se han aplicado exponen sus controles de parámetros. Esto hace que sea muy fácil que puedas ajustarlas para conseguir el efecto que buscas. Además, múltiples filtros integrados o personalizados se pueden aplicar en conjunto para obtener resultados impresionantes.</p>
<p>Una vez que estés feliz con el resultado, guarda los cambios, como un cambio preestablecido. Esto te permite utilizar la configuración en otra ocasión.</p>
<h2>Efectos de Animación</h2>
<p>Los efectos no sólo pasan y ya. Vienen a ser, la transición de un estado a otro. Esto es lo que los hace expresivos.</p>
<p>CSS FilterLab viene con un conjunto básico de controles de animación que te ayudan a crear transiciones fluidas entre los valores de los parámetros del filtro.</p>
<p>Observa la línea de tiempo y controles en la parte inferior de la pantalla. Da clic en cualquier punto de la línea de tiempo, y entonces cambia los parámetros de los filtros activos. Esto crea un nuevo keyframe en la línea de tiempo. Pulsa el botón de play para ver ejecutarse la animación (Ver Figura 3).</p>
<p>Los keyframes pueden agregarse, arrastrándolos a lo largo de la línea de tiempo o eliminados para modificar la animación y obtener lo que deseas.</p>
<p>La duración de la animación puede ser cambiada desde el inicio, a la derecha de la línea de tiempo. Se mide en segundos.</p>
<p><iframe width="500" height="375" src="http://www.youtube.com/embed/fukVIMHVHQc?fs=1&#038;feature=oembed" frameborder="0" allowfullscreen></iframe></p>
<p>Un tutorial breve para crear una animación fold con CSS FilterLab (0:19)</p>
<h2>Sintaxis de código</h2>
<p>CSS FilterLab permite crear diversos efectos visuales. Es importante saber que esto se hace con CSS plano, aunque CSS de vanguardia.</p>
<p>En Adobe, hemos trabajado duro, junto con nuestros socios, para llevar esta tecnología a la web abierta. No vamos a ocultarla detrás de una herramienta.</p>
<p>CSS FilterLab muestra el código exacto que se está utilizando para conseguir un efecto una animación. Los paneles de sintaxis CSS y sintaxis de animación CSS, justo encima de la línea de tiempo, muestran justo lo que se espera, Puedes copiar este código en tus proyectos para hacer uso de los efectos. Debes tener en cuenta que los filtros CSS están empezando a estar disponibles en los navegadores.</p>
<h2>Creando nuevos filtros personalizados</h2>
<p>Aquí es donde las cosas pueden convertirse en un reto. Sin embargo, si tu encuentras a las matemáticas complejas y escribes shaders particularmente atractivos, te alegrará saber que CSS FilterLab incluye un editor de shader.</p>
<p>Para crear un nuevo filtro personalizado, empieza por separar un filtro personalizado de los ya existentes en el menú Agregar Filtro. Te darás cuenta que tu filtro separado aparece en la segunda pestaña del menú. Da clic en el icono de “customize” (personalizar) y obtendrás el núcleo de un filtro personalizado.</p>
<p>Desde este punto, tú tienes el completo control sobre los parámetros utilizados, sus tipos, así como el fragmento de código. Tus cambios son automáticamente guardados y almacenados localmente, en el navegador.</p>
<p>Los shaders están escritos en <a href="http://www.opengl.org/documentation/glsl/">OpenGL Shading Languaje(GLSL)</a>. El tema de escribir shaders está fuera del alcance de esta introducción, pero puedes aprender más de la documentación de GLSL. Asegúrate de leer acerca de los tipos, métodos y características del lenguaje para sacar lo mejor de tus shaders.</p>
<p style="text-align: center"><img src="http://activ.com.mx/wp-content/uploads/2012/12/fig031.jpg" alt="Panel de error" /></p>
<p style="text-align: center">Figura 3</p>
<p>El panel de error destaca los problemas con tu código de shaders, en tiempo real. Esto es realmente útil porque te mantiene en el mismo contexto, mientras que desarrollas y previsualizas. También puedes ver los resultados de tu código de shaders en tiempo real.</p>
<h2>Compartiendo e importando filtros personalizados</h2>
<p>Comparte tus filtros personalizados mediante su publicación a partir de CSS FilterLab como un resumen en GitHub. Los controles para hacer esto se encuentran en el panel de control de shader.</p>
<p>Una vez publicado, comparte el enlace con los demás. Ellos van a poder importar el filtro personalizado en CSS FilterLab y utilizarlo en su propio contenido. Para importar un filtro personalizado ve al menú Agregar Filtro, elige Importar y utiliza la URL.</p>
<h2>Código Abierto</h2>
<p>Todo el código CSS FilterLab está disponible gratuitamente en <a href="https://github.com/adobe/cssfilterlab">GitHub</a> bajo la licencia Apache v2. Estamos esperando tus comentarios y contribuciones al proyecto.</p>
<p>Si escribes shaders que te gustaría distribuir con CSS FilterLab, por favor, contribuye con el proyecto. Antes de revisar cualquier código, tomate un momento para familiarizarte con los lineamientos de contribución descritos en GitHub.</p>
<h2>A dónde ir desde aquí</h2>
<p>Los Filtros de CSS y los filtros personalizados, abren una gran cantidad de efectos creativos para contenido web. CSS FilterLab da solo una pista sobre lo que se está convirtiendo en posible. Pero el verdadero valor está en sus manos y en lo que se crea con esta tecnología.</p>
<p>Piensa un poco en las nuevas oportunidades para la interacción y expresiones de los filtros, manipulación de geometría y efectos cinematográficos pueden aportar a su trabajo. Piensa acerca de lo que esto significa para tu contenido en una gran pantalla, en un dispositivo móvil, y en muchos contextos nuevos.</p>
<p>Usa CSS FilterLab para aprender las capacidades de la web gráfica moderna y comparte tus pensamientos con nosotros. Nos gustaría saber que creas con ellos.</p>
<p>Alan Greenblatt de Adobe, ha creado un pequeño <a href="http://blattchat.com/2012/10/02/css-filterlab/">video tutorial de CSS FilterLab</a>. Si estas interesado en aprender más, ese es un buen lugar para empezar.</p>
<p>También puedes encontrar más acerca de las contribuciones de Adobe para hacer mejor la web, para esto visita <a href="http://html.adobe.com/">html.adobe.com</a>.</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/css-filterlab.html">Adobe Devnet</a>, 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/experimentos-de-css3-con-adobe-filterlab/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>
	</channel>
</rss>
