<?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"
	>

<channel>
	<title>QuarkBlog &#187; JavaScript</title>
	<atom:link href="http://quarkblog.org/category/programacin/javascript/feed/" rel="self" type="application/rss+xml" />
	<link>http://quarkblog.org</link>
	<description>If you can read this, you need another beer.</description>
	<pubDate>Thu, 07 Aug 2008 07:20:00 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.5.1</generator>
	<language>en</language>
			<item>
		<title>Orientación a Objetos en JavaScript: variables y métodos privados/públicos</title>
		<link>http://quarkblog.org/2007/03/18/orientacion-a-objetos-en-javascript-variables-y-metodos-privadospublicos/</link>
		<comments>http://quarkblog.org/2007/03/18/orientacion-a-objetos-en-javascript-variables-y-metodos-privadospublicos/#comments</comments>
		<pubDate>Sun, 18 Mar 2007 17:04:19 +0000</pubDate>
		<dc:creator>Moisés Maciá</dc:creator>
		
		<category><![CDATA[JavaScript]]></category>

		<category><![CDATA[Programación]]></category>

		<guid isPermaLink="false">http://quarkblog.org/2007/03/18/orientacion-a-objetos-en-javascript-variables-y-metodos-privadospublicos/</guid>
		<description><![CDATA[Vamos a ver si retomamos el pulso del blog que últimamente no tengo apenas tiempo para escribir y esta la cosa de capa caida.
En las últimas semanas he escrito varios miles de lineas en JavaScript, un lenguaje por el que no daba ni un duro y que me ha sorprendido gratamente. Creo que ese desprecio [...]]]></description>
			<content:encoded><![CDATA[<p>Vamos a ver si retomamos el pulso del blog que últimamente no tengo apenas tiempo para escribir y esta la cosa de capa caida.</p>
<p>En las últimas semanas he escrito varios miles de lineas en JavaScript, un lenguaje por el que no daba ni un duro y que me ha sorprendido gratamente. Creo que ese <em>desprecio</em> por parte de los desarrolladores es una inmerecida lacra que tiene JavaScript desde el principio de su existencia, siendo considerado como un lenguaje para hacer <em>chorradillas</em> de no más de 5 lineas en las webs. Nada más lejos de la realidad: JavaScript es increíblemente potente pero para apreciar su potencia hay que aprender a jugar en su campo ya que es muy diferente de otros lenguajes de programación.</p>
<p>Voy a dedicar bastantes artículos en el blog a JavaScript. El primero de la serie está dedicado a la peculiar orientación a objetos que propone el lenguaje, muy diferente de la orientación <em>clásica</em> de lenguajes como C++ o Java.</p>
<p>En JavaScript no hay una palabra reservada <code>Class</code> con la que definir estáticamente un objeto &mdash;recordemos que es un lenguaje de script por lo que <em>estático</em> no es un atributo adecuado que podamos utilizar para definirlo&mdash; por el contrario tenemos varias formas de simular la orientación a ojetos (encapsulación, herencia, etc.), yo voy a emplear las clausuras y los prototipos para declarar una clase con métodos y variables privadas.</p>
<h4>Resumen</h4>
<ul>
<li>Hay una <strong>función base</strong> que toma el rol de <strong>constructor de clase</strong> a la vieja usanza de Java o C++. A esta función se le pueden <q>enchufar</q> métodos en tiempo de ejecución por medio de los <strong>prototipos</strong>.</li>
<li>Las variables privadas se declaran con la palabra reservada <code>var</code> dentro de la función base, y sólo pueden ser accedidas por funciones privadas y métodos privilegiados.</li>
<li>Las funciones privadas se declaran dentro de la función constructora (o de manera alternativa a través de <code>var functionName = function () {...}</code>) y sólo pueden ser llamadas por los métodos privilegiados (incluyendo la función constructora).</li>
<li>Los métodos privilegiados se declaran con la forma <code>this.methodName = function () {...}</code> y pueden ser invocados desde el código externo al <q>objeto</q>.</li>
<li>La porpiedades públicas se declaran con la forma <code>this.variableName</code> y pueden ser leidas y escritas desde fuera del <q>objeto</q>.</li>
<li>Lo métodos públicos se definen con la forma <code>Classname.prototype.methodName = function(){...}</code> y pueden ser llamados desde fuera del <q>objeto</q>.</li>
<li>Las propiedades de prototipo se definen con la forma <code>Classname.prototype.propertyName = someValue</code><code>.</code></li>
<li>Las propiedades estáticas se definen con la forma <code>Classname.propertyName = someValue</code><code>.</code></li>
</ul>
<h4>Ejemplo</h4>
<p>En este ejemplo, una persona obtiene su nombre y raza al nacer y estos parámetros no pueden ser cambiados nunca. Cuando nace, empieza teniendo un año y se determina un valor de edad máxima para esta persona. El individuo tiene un peso que se modifica al comer (triplicando su peso) o haciendo ejercicio (reduciéndolo a la mitad). Cada vez que la persona come o hace ejercicio, crece un año. El objeto persona tiene una propiedad de acceso público &#8216;<code>clothing</code>&#8216; que cualquiera puede modificar, asi como un factor de suciedad que puede ser modificado manualmente (ensuciándose o limpiándose), pero que se incrementa cada vez que la persona come o hace ejercicio, y se reduce cada vez que se utiliza el método <code>shower()</code>.</p>
<h4>Código de ejemplo</h4>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">function</span> Person <span class="br0">&#40;</span>n, race<span class="br0">&#41;</span> </div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">constructor</span>.<span class="me1">population</span>++;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// PRIVATE VARIABLES AND FUNCTIONS </span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// ONLY PRIVELEGED METHODS MAY VIEW/EDIT/INVOKE </span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">var</span> alive = <span class="kw2">true</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">var</span> age = <span class="nu0">1</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw2">var</span> maxAge = <span class="nu0">70</span> + Math.<span class="me1">round</span><span class="br0">&#40;</span>Math.<span class="me1">random</span><span class="br0">&#40;</span><span class="br0">&#41;</span> * <span class="nu0">15</span><span class="br0">&#41;</span> + Math.<span class="me1">round</span><span class="br0">&#40;</span>Math.<span class="me1">random</span><span class="br0">&#40;</span><span class="br0">&#41;</span> * <span class="nu0">15</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">function</span> makeOlder <span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> alive = <span class="br0">&#40;</span>++age &lt; = maxAge<span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">var</span> myName = n ? n : <span class="st0">&quot;John Doe&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">var</span> weight = <span class="nu0">1</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// PRIVILEGED METHODS </span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// MAY BE INVOKED PUBLICLY AND MAY ACCESS PRIVATE ITEMS </span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// MAY NOT BE CHANGED; MAY BE REPLACED WITH PUBLIC FLAVORS </span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">toString</span> = <span class="kw1">this</span>.<span class="me1">getName</span> = <span class="kw2">function</span> <span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> <span class="kw1">return</span> myName <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">eat</span> = <span class="kw2">function</span> <span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>makeOlder<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">dirtFactor</span>++;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> weight *= <span class="nu0">3</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span> <span class="kw3">alert</span><span class="br0">&#40;</span>myName + <span class="st0">&quot; can&#8217;t eat, he&#8217;s dead!&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">exercise</span> = <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>makeOlder<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">dirtFactor</span>++;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> weight /= <span class="nu0">2</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span> <span class="kw3">alert</span><span class="br0">&#40;</span>myName + <span class="st0">&quot; can&#8217;t exercise, he&#8217;s dead!&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">weigh</span> = <span class="kw2">function</span> <span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> <span class="kw1">return</span> weight <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">getRace</span> = <span class="kw2">function</span> <span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> <span class="kw1">return</span> race <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">getAge</span> = <span class="kw2">function</span> <span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> <span class="kw1">return</span> age <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">muchTimePasses</span> = <span class="kw2">function</span> <span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> age += <span class="nu0">50</span>; <span class="kw1">this</span>.<span class="me1">dirtFactor</span> = <span class="nu0">10</span>; <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// PUBLIC PROPERTIES &#8212; ANYONE MAY READ/WRITE </span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">clothing</span> = <span class="st0">&quot;nothing/naked&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">dirtFactor</span> = <span class="nu0">0</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span> </div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// PUBLIC METHODS &#8212; ANYONE MAY READ/WRITE </span></div>
</li>
<li class="li1">
<div class="de1">Person.<span class="me1">prototype</span>.<span class="me1">beCool</span> = <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span> <span class="kw1">this</span>.<span class="me1">clothing</span> = <span class="st0">&quot;khakis and black shirt&quot;</span> <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">Person.<span class="me1">prototype</span>.<span class="me1">shower</span> = <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span> <span class="kw1">this</span>.<span class="me1">dirtFactor</span> = <span class="nu0">2</span> <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">Person.<span class="me1">prototype</span>.<span class="me1">showLegs</span> = <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span> <span class="kw3">alert</span><span class="br0">&#40;</span><span class="kw1">this</span> + <span class="st0">&quot; has &quot;</span> + <span class="kw1">this</span>.<span class="me1">legs</span> + <span class="st0">&quot; legs&quot;</span><span class="br0">&#41;</span> <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">Person.<span class="me1">prototype</span>.<span class="me1">amputate</span> = <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span> <span class="kw1">this</span>.<span class="me1">legs</span>&#8211; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="co1">// PROTOTYOPE PROPERTIES &#8212; ANYONE MAY READ/WRITE (but may be overridden)</span></div>
</li>
<li class="li1">
<div class="de1">Person.<span class="me1">prototype</span>.<span class="me1">legs</span> = <span class="nu0">2</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// STATIC PROPERTIES &#8212; ANYONE MAY READ/WRITE </span></div>
</li>
<li class="li2">
<div class="de2">Person.<span class="me1">population</span> = <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
</ol>
</div>
<p>Aquí hay un pequeño programa que utiliza la clase persona:</p>
</pre>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">function</span> RunGavinsLife<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// Instanciamos el objeto perrsona</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw2">var</span> gk = <span class="kw2">new</span> Person<span class="br0">&#40;</span><span class="st0">&quot;Gavin&quot;</span>,<span class="st0">&quot;caucasian&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">var</span> lk = <span class="kw2">new</span> Person<span class="br0">&#40;</span><span class="st0">&quot;Lisa&quot;</span>,<span class="st0">&quot;caucasian&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw3">alert</span><span class="br0">&#40;</span><span class="st0">&quot;There are now &quot;</span> + Person.<span class="me1">population</span> + <span class="st0">&quot; people&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// ambos comparten la misma variable &#8216;Person.prototype.legs&#8217; cuando accedemos a su &#8216;this.legs&#8217;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; gk.<span class="me1">showLegs</span><span class="br0">&#40;</span><span class="br0">&#41;</span>; lk.<span class="me1">showLegs</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// crea una variable publica, pero no sobreeescribe la variable privada &#8216;race&#8217;.</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; gk.<span class="me1">race</span> = <span class="st0">&quot;hispanic&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// devuelve &#8216;caucasian&#8217; desde la variable privada &#8216;race&#8217; especificada en la creacion.</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw3">alert</span><span class="br0">&#40;</span>gk + <span class="st0">&quot;&#8217;s real race is &quot;</span> + gk.<span class="me1">getRace</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// engorda 3&#8230; 9&#8230; y 27</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; gk.<span class="me1">eat</span><span class="br0">&#40;</span><span class="br0">&#41;</span>; gk.<span class="me1">eat</span><span class="br0">&#40;</span><span class="br0">&#41;</span>; gk.<span class="me1">eat</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw3">alert</span><span class="br0">&#40;</span>gk + <span class="st0">&quot; weighs &quot;</span> + gk.<span class="me1">weigh</span><span class="br0">&#40;</span><span class="br0">&#41;</span> + <span class="st0">&quot; pounds and has a dirt factor of &quot;</span> + gk.<span class="me1">dirtFactor</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="co1">// adelgaza hasta 13.5</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; gk.<span class="me1">exercise</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// la ropa se actualiza para estar a la moda</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; gk.<span class="me1">beCool</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// la ropa es una variable publica que puede ser actualizada a cualquier valor guay</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; gk.<span class="me1">clothing</span>=<span class="st0">&quot;Pimp Outfit&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; gk.<span class="me1">shower</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw3">alert</span><span class="br0">&#40;</span><span class="st0">&quot;Existing shower technology has gotten &quot;</span> + gk + <span class="st0">&quot; to a dirt factor of &quot;</span> + gk.<span class="me1">dirtFactor</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// han pasado 50 años</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; gk.<span class="me1">muchTimePasses</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// sobreescribe la ducha original para todo el mundo</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; Person.<span class="me1">prototype</span>.<span class="me1">shower</span> = <span class="kw2">function</span> <span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">dirtFactor</span> = <span class="nu0">0</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// Gavin tiene su propia idea de la moda</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; gk.<span class="me1">beCool</span> = <span class="kw2">function</span> <span class="br0">&#40;</span><span class="br0">&#41;</span> </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">clothing</span> = <span class="st0">&quot;tinfoil&quot;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="br0">&#125;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; gk.<span class="me1">beCool</span><span class="br0">&#40;</span><span class="br0">&#41;</span>; gk.<span class="me1">shower</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw3">alert</span><span class="br0">&#40;</span><span class="st0">&quot;Fashionable &quot;</span> + gk + <span class="st0">&quot; at &quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; +gk.<span class="me1">getAge</span><span class="br0">&#40;</span><span class="br0">&#41;</span>+<span class="st0">&quot; years old is now wearing &quot;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; +gk.<span class="me1">clothing</span>+<span class="st0">&quot; with dirt factor &quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; +gk.<span class="me1">dirtFactor</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// utiliza la propiedad de prototipo</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; gk.<span class="me1">amputate</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// lisa continua teniendo su propiedad de prototipo</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; gk.<span class="me1">showLegs</span><span class="br0">&#40;</span><span class="br0">&#41;</span>; lk.<span class="me1">showLegs</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// han pasado 50 años, Gavin tiene mas de 100 años</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; gk.<span class="me1">muchTimePasses</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// la muerte muestra una incapacidad para comer</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; gk.<span class="me1">eat</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
</ol>
</div>
<h4>Notas</h4>
<ul>
<li><code>maxAge</code> es una variable privada sin un método accesor privilegiado; como tal, no hay manera pública de hacer un <em>get</em> o un <em>set</em> sobre ella.</li>
<li><code>race</code> es una variable privada definida sólo como una rgumento del constuctor. Las variables pasadas al constructor están disponibles para el objeto como variables privadas.</li>
<li>El método <code>'tinfoil' beCool()</code> fue aplicado sólamente al objeto <code>gk</code>, no a la clase Persona entera. Otras personas creadas y que uticen el método <code>beCool()</code> pueden continuar usando el original <em>&#8216;khakis and black shirt&#8217;</em> que Gavin deshechó en vida.</li>
<li>Observa la llamada implicita al método <code>gk.toString() cada vez que hay una concatenación de cadenas. Eso es lo que permite al código </code><code>alert(gk + ' is so cool.')</code> poner la palabra &#8216;Gavin&#8217;, y es equivalente a hacer <code>alert(gk.toString() + ' is so cool.')</code>. Cada objeto de cada tipo en JavaScript tiene un método <em>.toString()</em>, pero lo puedes sobeescribir con uno propio.</li>
<li>No puedes asignar métodos públicos a una clase dentro del objeto constructor. Debes uilizar la propiedad <code>prototype</code> de manera externa, como se ve en los métodos <code>beCool()</code> y <code>shower()</code>.</li>
<li>Como he intentado mostrar en la propiedad <code>Person.prototype.legs</code> y en la función <code>amputate()</code>, las propiedades de prototipo estan compartidads por todas las instancias del objeto. Preguntando por <code>lk.legs</code> nos devuelve &#8216;2&#8242; despues de mirar la propiedad de prototipo. Sin embargo, si intentamos cambiar este valor utilizando <code>gk.legs=1</code> o (en el objeto Persona) <code>this.legs=1</code> acaba creando una nueva propiedad pública del objeto específico de dicha instancia. (Esta es la razón por la que llamando a <code>gk.amputate()</code> sólo se le quia una pierna a Gavn, pero no a Lisa.) Para modificar una propiedad de prototipo, debes utilizar <code>Person.prototype.legs=1</code> o algo parecido a <code>this.constructor.prototype.legs=1</code>. (Digo <em>algo parecido a</em> porque he descubierto que <code>this.constructor</code> no esta disponible dentro de las funciones privadas de un objeto, sino que apunta a el objeto <code>window</code> de su ambito.)</li>
<li>Si una función anonima se declara <em>inline</em> con
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">foo = <span class="kw2">function</span> <span class="br0">&#40;</span>p1,p2<span class="br0">&#41;</span> <span class="br0">&#123;</span> some code <span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>	el constructor <code>new Function()</code> <strong>no</strong> es equivalente, por ejemplo </p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">foo = <span class="kw2">new</span> <span class="kw2">Function</span><span class="br0">&#40;</span><span class="st0">&#8216;p1&#8242;</span>,<span class="st0">&#8216;p2&#8242;</span>,<span class="st0">&#8216;code&#8217;</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>	La razón es que la última función se ejecuta en el ámbito global &mdash;en lugar de heredar el ámbito de su función constructora&mdash; previniendola de acceder a las variables privadas.</li>
<li>Como habrás notado en los comentarios del código, el echo de asigna un valor a <code>gk.race</code> <strong>no</strong> sobreescribe la variable privada <code>race</code>. Aunque si bien pede parecer una idea estúpida, puedes tenerr dos variables (una pública y otra privada) con el mismo nobre. Por ejemplo, el método <code>yell()</code> en la siguiente clase devuelve diferentes valores para <code>foo</code> y <code>this.foo</code>:
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">function</span> StupidClass<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">var</span> foo = <span class="st0">&quot;internal&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">foo</span> = <span class="st0">&quot;external&quot;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">yell</span>=<span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span> <span class="kw3">alert</span><span class="br0">&#40;</span><span class="st0">&quot;Internal foo is &quot;</span>+foo+<span class="st0">&quot;<span class="es0">\n</span>External foo is &quot;</span>+<span class="kw1">this</span>.<span class="me1">foo</span><span class="br0">&#41;</span> <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
</li>
<li>Las funciones privadas y los métodos privilegiados, como las variables privadas y las propiedades públicas, son instanciadas con cada nuevo objeto creado. Asi que cada vez que se llama a un nuevo <code>Person()</code>, nuevas copias de <code>makeOlder()</code>, <code>toString()</code>, <code>getName()</code>, <code>eat()</code>, <code>exercise()</code>, <code>weigh()</code>, <code>getRace()</code>, <code>getAge()</code>, y <code>muchTimePasses()</code> son creadas. Para cada persona, cada vez.
<p>	Si comparamos esto con los métodos públicos (sólo existe una copia de <code>beCool()</code> y <code>shower()</code> sin importar cuantas personas hayamos creados) puedes ver que por razones de rendimiento y memoria es preferible degradar la protección de un objeto y utilizar métodos públicos.</p>
<p>	Hacer esto requiere que transformemos variables privadas en públicas (porque sin accesores privilegiados no hay manera de utilizarlas) así los método públicos podrán acceder a ellas&#8230; y también código externo podrá ver y destruir dichas variables. La optimización de utilizar únicamente propiedades y métodos públicos hace que tu código sea menos robusto.</p>
<p>	Por ejemplo, en el código de arriba <code>age</code> y <code>maxAge</code> son variables privadas; <code>age</code> sólo puede ser accedida externamente a trevés de <code>getAge()</code> (y no puede cambiar su valor) y <code>maxAge</code> no puede ser leida ni modificada externamente. Cambiandolas para que sean propiedades públicas permite que cualquier código haga cosas como </p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">gk.<span class="me1">maxAge</span>=<span class="nu0">1</span>; gk.<span class="me1">age</span>=<span class="nu0">200</span>;</div>
</li>
</ol>
</div>
<p>	cosa que no sólo no tiene sentido (no deberías poder manipular directamente la esperanza de vida de alguien), sino que modificando esas variables directamente la variable <code>alive</code> no se actualiza correctamente, dejando a la persona en un estado incongruente.</li>
</ul>
<h4>Recursos</h4>
<p>Más información sobre clausuras, funciones anónimas y prototipos en le libro <em><q>JavaScript, The Definitive Guide</q></em> de David Flanagan editado por O&#8217;Reilly.</p>
<p>El código original de la clase Persona fue creado por Gavin Kistner.</p>
]]></content:encoded>
			<wfw:commentRss>http://quarkblog.org/2007/03/18/orientacion-a-objetos-en-javascript-variables-y-metodos-privadospublicos/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>

<!-- Dynamic Page Served (once) in 2.420 seconds -->
<!-- Cached page served by WP-Cache -->
