2009-12-27 16 views
8

Me pregunto cuándo es necesario utilizar la palabra clave this.somevar en lugar de simplemente somevar.as3: uso de esta palabra clave

Por lo general no uso esto en las siguientes circunstancias:

  1. he hecho una var privada para una clase
  2. me refiero a ella con el fin de utilizarlo como una var para esa clase

correcto? o no es solo una cuestión de estilo?

Respuesta

9

Por lo general, es suficiente con utilizar this.varname si está dentro de una función que tiene un parámetro con el mismo nombre y que desea hacer referencia a la variable miembro. Si el miembro var es privado o no tiene ningún efecto al tener que usar 'esto'.

+0

gracias. esto aclara lo que esperaba averiguar. – jml

3

Si usa esto dentro de un objeto, esto se referirá al objeto en sí. He aquí un ejemplo en el que lo utilizaría:

package 
{ 
    public class foo 
    { 
     private var variable:uint; 

     public function foo(variable:uint) 
     { 
      this.variable = variable; 
     } 
    } 
} 
+0

estaba diciendo que creo que esto sucede de todos modos. vea el comentario a continuación; lo encontré útil. ¡Gracias! – jml

4

Como ya se ha mencionado, no es necesario utilizar esta en un caso muy simple, en la que desea hacer referencia a una variable miembro de la clase de un método miembro de la clase, por ejemplo:

public function myClassMethod() : void 
{ 
    // "this" is redundant here, as it is implied if omitted 
    this.myPrivateOrPublicVariable = 123; 
} 

Tenga en cuenta que hay casos en que este (que se evalúa en el momento en que se encuentra en un programa, en lugar de en una instanciación como se podría adivinar) no se refiere a la clase en la que está escrito. Más específicamente, esto sucede cuando lo usa dentro de una función que se llamará utilizando un método como Function.apply(). Este método permite al que llama especificar el objeto al que se hará referencia en este, y se usa comúnmente en devoluciones de llamadas, p. en motores de tweening.

// Call myFunction(listOfArguments[0], listOfArguments[1] ...), 
// with this referring to objectReferredToByThis. 
myFunction.apply(objectReferredToByThis, listOfArguments); 

Aquí hay un ejemplo con el popular Tweener motor de interpolación, donde el comportamiento por defecto es tener este se refieren al objeto interpolado (es decir, el _mc MovieClip), en lugar de a una instancia de la clase en que este está escrito (es decir, MyClass).

package 
{ 
    /* ... imports ... */ 

    public class MyClass extends Sprite 
    { 
    private var _mc : MovieClip; 

    public function tweenSomething() : void 
    { 
     var tween : Object = { 
     x: 0, 
     time: 1, 
     onComplete: function() : void { 
      // Here, "this" will not refer to the instance 
      // of MyClass, but rather to the _mc MovieClip, 
      // which is the object being tweened below. 
      this.visible = false; 
     } 
     }; 

     Tweener.addTween(_mc, tween); 
    } 
    } 
} 

En el código anterior, el uso de este es necesario, porque queremos instruir explícitamente el tiempo de ejecución para modificar el estado visible de nuestra MovieClip (_mc). Si no hubiésemos usado este, la referencia visible se habría referido a MyClass.visible, debido al cierre de la función.

+0

gracias por entrar en los detalles de esto. aprecio las aclaraciones. – jml

+0

hmm, no entiendo por qué en el ejemplo de tweener esto. se refiere al movieclip. – Rihards

+0

@Richards, lo hace porque la persona que llama (dentro de Tweener) especificó el objetivo de interpolación como referencia por la variable "this". Consulte la documentación sobre Function.apply(). Aclamaciones – richardolsson

0

Cómo comenzar a utilizar this palabra clave, en primer lugar, porque le ayuda a reconocer rápidamente si la variable local o global (método o clase de propiedad) en el código. Todo lo que necesita es una parte del código donde puede ver this y luego darse cuenta inmediatamente de que esta es una variable de clase visible globalmente, en lugar de desplazamiento adicional para la definición del objetivo.

2

algo que añadir a las otras respuestas: En ActionScript 3, se puede hacer referencia a variables y funciones miembro básicamente dos maneras:

// 1. the normal way 
obj.var = 5; 
obj.func(); 

// 2. the auxiliary way 
obj["var"] = 5; 
obj["func"](); 

Esto puede parecer inútil, pero hay ciertos casos en los que, por ejemplo, concatenando cadenas en varias combinaciones para uso aleatorio, variables o funciones especificadas de forma dinámica en un objeto puede ser útil, como este:

private function someFunc():void 
{ 
    obj[randomFuncStr()](); 
} 

private function randomFuncStr():String 
{ 
    // randomly decide on a function to call and return its name as a String 
} 

Pero lo que si desea utilizar cadenas para acceder a las variables o funciones dentro de this? Esto no funciona:

"var" = 5; // error 
"func"(); // error 

Así que lo que tiene que hacer en su lugar es la siguiente:

this["var"] = 5; // the this keyword is good for something after all! 
this["func"](); // " " " " " " " " " 

Otras personas ya han mencionado esta razón siguiente, pero la primera vez que tomó this.var o this.func() serio en AS3 (y usualmente aún miro su uso con claro desprecio) fue cuando estaba anulando UIComponent.setLayoutBoundsSize(), que tiene un parámetro llamado width y un parámetro llamado height. UIComponent también utiliza estos nombres como propiedades, y no me gusta cambiar los nombres de los parámetros al anular un método. Así que decir cosas como this.width = x; o this.height = y; de repente se volvió relevante. Aparte de estos dos escenarios, no veo ninguna razón para usar this al referirme a una variable o función dentro del mismo objeto internamente.

Como nota al margen, si tiene que hacer lo siguiente por la forma en que se ha construido una API o por alguna otra razón realmente buena (intente evitar configurar cosas así de esta manera), ocasionalmente usted podría pasar this como un argumento para una función o algo que necesita una referencia de regreso al objeto que llama.