2008-10-23 8 views
6

Me gusta Prototype Pattern example de Steve Yegge y decidí impulsar un ejemplo de prueba rápida de concepto.¿Cómo maneja el ejemplo de prototipo de Yegge las variables de instancia?

Sin embargo, realmente no pensé bien. Si bien es excelente para especificar dinámicamente el comportamiento de los objetos y es una solución fácil para el ejemplo de Steve opinionated elf, todavía estoy tratando de encontrar la mejor manera de manejar variables de instancia.

Por ejemplo, supongamos que tengo un objeto AwesomeDragon. Luego quiero crear un objeto AwesomeDragonImmuneToFire para crear un hijo nuevo de AwesomeDragon (AwesomeDragonImmuneToFire hereda propiedades de AwesomeDragon) y 'poner' "ImmuneToFire" como una propiedad con un valor de 'verdadero'. Hasta aquí todo bien. Ahora digamos que quiero enviar mi objeto AwesomeDragon en un recorrido por las aldeas campesinas cercanas. Esto implicará la actualización de la propiedad 'posición' de AwesomeDragon. Sin embargo, en el momento en que haga esto, AwesomeDragonImmuneToFire despegará también.

Es la mejor solución para anular los valores de instancia al crear objetos, p. Ej. inmediatamente 'coloque' el valor 'posición' en AwesomeDragonImmuneToFire en el valor 'get' actual de 'posición'?

Respuesta

10

¿No depende de cómo implementa realmente la herencia en su sistema?

Por ejemplo, en una versión de JavaScript de lo que describes, el prototype para AwesomeDragonImmuneToFire normalmente sería un ejemplo de un AwesomeDragon, y ya que siempre estaría trabajando con instancias, no importaría lo que haces a cualquier particular, AwesomeDragon:

function Dragon() 
{ 
    this.position = "starting point"; 
} 

function AwesomeDragon() 
{ 
    this.awesome = true; 
} 
AwesomeDragon.prototype = new Dragon(); 

function AwesomeDragonImmuneToFire() 
{ 
    this.immuneToFire = true; 
} 
AwesomeDragonImmuneToFire.prototype = new AwesomeDragon(); 

>>> var awesome = new AwesomeDragon(); 
>>> var immune = new AwesomeDragonImmuneToFire(); 
>>> awesome.position = "flying above village"; 
>>> immune.position; 
"starting point" 
>>> immune.awesome 
true 

En este ejemplo, no hay clases y todas las instancias son sólo ejemplos de Object que suceden saber qué función se utilizó para construir ellos. new es solo a bit of syntactic sugar y el uso de StudlyCaps para funciones de constructor es solo una convención para funciones que están destinadas a ser utilizadas con new.

La clave es que cada objeto tiene una cadena de objetos prototipo, que se examina si intenta acceder a un atributo que el objeto no contiene, según la descripción de Yegge de lo que es el "Patrón de propiedades".

https://developer.mozilla.org/en/Core_JavaScript_1.5_Guide/Details_of_the_Object_Model

+0

Pensé que la idea de los Prototipos era que no había clases reales, solo instancias de una clase de prototipo. El principio híbrido podría funcionar bien, supongo, pero me preocupa que luego se vea obligado a verificar los métodos de los objetos y las propiedades del prototipo. –

+0

Gracias por los comentarios, por cierto, me gusta su ejemplo y votó en sentido ascendente. –

+0

De hecho, solo hay instancias. Sin embargo, la instancia de Awesome utilizada como prototipo e instancia de Awesome utilizada en worlflow puede ser diferente a la del ejemplo anterior –

1

Esto implicará la actualización de la propiedad 'position' de AwesomeDragon. Sin embargo, en el momento en que haga esto, AwesomeDragonImmuneToFire despegará también.

Quizás malinterprete, pero no estoy seguro de por qué piensas que el AwesomeDragonImmuneToFire despegará también. Si son dos objetos distintos y la posición es una propiedad de los objetos, cada instancia (dragón) tendrá su propia posición. Cambiar la posición de un dragón no debería afectar la posición del otro.

+1

En las propiedades del patrón prototipo heredan del objeto principal.Entonces, hasta que defina una posición para AwesomeDragonImmuneToFire, hereda la posición de AwesomeDragon. –

Cuestiones relacionadas