2011-12-02 30 views
11

Soy nuevo en CoffeeScript (y bastante experiencia con JS también, así que lo siento si esto es ingenuo) y yo estaba tratando de crear una clase de la siguiente manera:CoffeeScript Miembros de la Clase

class Test 
    a: [] 

    make: -> 
     @a.push ['A', 'B', 'C'] 

    getdata: -> 
     output = "" 
     for i in @a 
      output += i 
     output 

b = new Test 
b.make() 

alert(b.getdata()) 


c = new Test 
c.make() 

alert(c.getdata()) 

La salida que recibo es: "A, B, C" "A, B, C, A, B, C"

A pesar de crear una nueva instancia de 'Prueba'; la matriz se anexa y no se borra. ¿Qué estoy haciendo mal aquí? ¿Inicializo incorrectamente la variable miembro?

+3

Debería observar cómo funcionan los prototipos y observar el código generado por JavaScript. Veo mucho de este error en coffeescript (incluso en tutoriales/libros de cocina). La regla que uso es definir solo las funciones y las propiedades estáticas en los miembros de la clase (defino propiedades de instancia en el constructor con la sintaxis @member). Y sí, es algo confuso dado el uso del coffeescript de la clase de palabra clave. – Guillaume86

+3

nota al margen: 'getdata: -> @ a.join ('')' – tokland

+0

Gracias Guillaume86 y tokland. Aprendí mucho de esto. – Anoop

Respuesta

23

Cuando define a: [], está creando un único objeto de matriz en el prototipo de clase. Cada instancia de la clase que crees tendrá este mismo objeto de matriz. Cada vez que una instancia modifica el valor, el cambio es visible para todos los demás.

Tenga en cuenta que este es solo el caso si modifica un valor, como al agregar elementos a una matriz. Si reemplaza el valor, por ejemplo asignando una nueva matriz, esto solo afectará a la instancia actual.

Cuando se desea una propiedad que ha inicializado en una base por ejemplo, usted debe definirlo en el constructor, cuando la instancia se crea realmente:

class Test 
    constructor: -> 
     @a = [] 
     @a.push ['A', 'B', 'C'] 

    getdata: -> 
     output = "" 
     for i in @a 
      output += i 
     output 

b = new Test 

alert(b.getdata()) 


c = new Test 

alert(c.getdata()) 

Try this out y encontrará que funciona como usted quiere.

+1

No es de extrañar que la gente se confunda cuando vea cosas como esas: http://coffeescriptcookbook.com/chapters/classes_and_objects/ chain – Guillaume86

+0

¡Gracias! Ahora entiendo. Lo que me confundió aún más fue la diferencia de modificación/reemplazo en el comportamiento. Ahora eso está despejado también. Gracias por la ayuda. – Anoop

+0

Este mal consejo también se repite aquí http://arcturo.github.io/library/coffeescript/03_classes.html y casi caigo en la misma trampa. Ojalá los documentos de Coffeescript me aconsejen sobre esto. – aaron

Cuestiones relacionadas