Comunidad de diseño web y desarrollo en internet online

Clases personalizadas, variables e instancias

Citar            
MensajeEscrito el 17 Jun 2007 08:41 pm
Hola, estoy aprendiendo a construir mis clases y tengo una duda: ¿que diferencia hay entre definir una variable o una función dentro de la classe o dentro de la función constructora?

Las primeras son variables que solo hay una por clase i las segundas una por instancia ¿no?
¿Entonces porque al hacer esto sale mal?:

Código :

var cosa:miClase = new miClase ();
trace (cosa.propiedad) //devuelve undefined
¿Entonces como hago para hacer propiedades de instancia?

**la variable propiedad la he definido dentro de la función constructora

Por ferranpujol

177 de clabLevel



 

Mataró (Barcelona), España

msie
Citar            
MensajeEscrito el 17 Jun 2007 10:16 pm
No, si declaras una variable dentro de la función constructora de la clase, al igual que si la declarases en otra función, el ámbito de esta variable será esa función; es decir, solo podrás acceder al valor de esa variable dentro de la función, sea constructora de clase o no. Por eso el trace te devuelve undefined, fuera de la función no puedes acceder a esa variable.

Saludos!

Por dmvalverde

150 de clabLevel



Genero:Masculino  

Extremadura

firefox
Citar            
MensajeEscrito el 18 Jun 2007 10:55 am
Vale, ok. ¿Pero entonces como hago para que una función que he llamado con setInterval recupere una variable? Así:

Código :

class window {
   var active:String = new String ();
   var interval:Number = new Number ();
   public function window () {
      active = arguments[0]._name;
      trace (active);
      var interval:Number = setInterval (period, 60);
   }
   public function period () {
      trace ("period");
      trace (active)
   }
}

Esto al crear una instancio de window devuelve correctamente el argumento pasado a active, tracea correctamente "period" indicando que se ejecuta periodica y correctamente la función period, pero devuelve undefined al trazar active desde esta otra función. Si nos referimos a la propiedad active desde la película fla la devuelve correctamente, así:

Código :

import window;
w = new window (clip1, clip1, clip2);
trace (w.active) //devuelve clip1

¿Que és lo que pasa?

Por ferranpujol

177 de clabLevel



 

Mataró (Barcelona), España

msie
Citar            
MensajeEscrito el 18 Jun 2007 12:00 pm
Hola,

lo primero de todo es que si quieres utilizar setInterval dentro de una clase debes utilizar la siguiente sintaxis:

Código :

setInterval (this, "period", 60);


porque si utilizas la que estás usando pierdes el ámbito de la clase y, por tanto, los atributos de la clase (por eso no puedes acceder a active). Pruébalo así y funcionará correctamente.

Ahora un par de cosillas más:

1. Las variables de tipo Number y String no hace falta que les hagas un new porque son "tipos primitivos" del lenguaje.

2. Tienes declaradas dos variables distintas para interval. Una que tiene el ámbito de toda la clase y otra que solo tiene el de una función. Además esta última es la que utilizas para crear el Interval por lo que si ahora quisieras pararlo no podrías porque no tendrías acceso a ella. Utiliza la que ya tienes declarada en la clase:

Código :

interval = setInterval (this, "period", 60);


y así podrás parar el intervalo cuando quieras.

Saludos!

Por dmvalverde

150 de clabLevel



Genero:Masculino  

Extremadura

firefox
Citar            
MensajeEscrito el 18 Jun 2007 03:42 pm
Muchisimas Gracias dmvalverde;) . Una cosita más, ¿como puedo hacer para poder eliminar una instancia de esta clase ejecutando una funcion de la misma?

Por ferranpujol

177 de clabLevel



 

Mataró (Barcelona), España

msie
Citar            
MensajeEscrito el 18 Jun 2007 04:05 pm
¿Eliminarse a sí misma desde dentro? Pues no se, no creo que se puede hacer... por lógica no se podría eliminar porque estarías ejecutando uno de sus métodos y si se pudiera cualquiera sabe lo que podría suceder :shock:

Lo normal es hacerlo desde el mismo sitio donde creaste la instancia con new, vamos, desde fuera de la clase.

Saludos!

Por dmvalverde

150 de clabLevel



Genero:Masculino  

Extremadura

firefox
Citar            
MensajeEscrito el 18 Jun 2007 04:18 pm
Ya, pero esta mia clase window es una clase que controla el comportamiento de unos movieclips, i me gustaria que en vez de eliminar la instancia, se ejecutara una función, que reduciese progresivamente el alpha de los clips controlados, i luego se eliminara la clase... Otro problema, ahora con public i private: tengo el siguiente código:

Código :

class window {
   var windowsNum:Number = new Number ();
   var clips:Array = new Array ();
   var inix:Array = new Array ();
   var iniy:Array = new Array ();
   private var active:String = new String ();
   var interval:Number = new Number ();
   function window () {
      windowsNum = arguments.length - 1;
      active = arguments[0][0]._name;
      for (var i:Number = 0; i < arguments.length - 1; i++) {
         clips[i] = arguments[i + 1]._name;
         inix[i] = arguments[i + 1]._x;
         iniy[i] = arguments[i + 1]._y;
      }
      interval = setInterval (this, "period", 60);
   }
   public function setActive (target:MovieClip) {
      active = target._name;
      trace (active);
   }
   public function closeActive () {
      active = null;
   }
   private function period () {
      _root[active]._xscale += 10;
      _root[active]._yscale += 10;
   }
}
i aunque tengo la variable active privada, puedo modificarla sin necessidad de la funcion setActive. Por otra parte la funcion period también es privada i puedo modificarla desde la linia de tiempo... ¿Que passa?

Por ferranpujol

177 de clabLevel



 

Mataró (Barcelona), España

msie

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.