ActionScript - получить имя экземпляра из конструктора без передачи параметров? - PullRequest
1 голос
/ 15 ноября 2010

возможно ли получить имя экземпляра класса из класса без необходимости вручную передавать имя экземпляра в качестве строкового параметра конструктору класса?

//Create New SizeClass
var big:SizeClass = new SizeClass();

//-------------

package
{
public class SizeClass
     {
     public function SizeClass()
          {
          trace( //-- Instance Name "big" --// );
          }
     }
}

Ответы [ 2 ]

1 голос
/ 15 ноября 2010

Имя экземпляра не очень важно.Вам лучше хранить ссылки на экземпляры внутри массива.

var sizes:Array = new Array();
var big:SizeClass = new SizeClass();
sizes.push( big );

Когда вы хотите получить к ним доступ, вы можете циклически перемещаться по массиву.

for (var i:uint = 0; i < list.length; ++i) 
{
    var size:SizeClass = list[i] as SizeClass;
    trace( size );
}

Кстати: вместоимя экземпляра можно добавить в ваш класс автоматический индекс.

package
{
  public class SizeClass 
  {
    private static var global_index:int = 0;
    public const INDEX:int = global_index ++;
  }
}

К которому вы можете получить доступ следующим образом:

var big:SizeClass = new SizeClass();
trace(big.INDEX) // 0

var small:SizeClass = new SizeClass();
trace(small.INDEX)// 1

источник: http://blog.stroep.nl/2010/08/auto-increment-as3-class/

1 голос
/ 15 ноября 2010

Нет, невозможно узнать что-либо о содержащем блоке кода во время конструктора, кроме того, что вы можете узнать из трассировки стека (хотя это не доступно, кроме как в отладочной версии Flash). Даже если бы у вас была глобальная точка доступа для содержащего класса, она все равно не позволила бы этот доступ.

Думайте о конструкторе как о вызове метода. В строке AS он будет называться до назначения. Например: var a:Foo = new Foo() создается Foo (конструктор завершается), а затем a заполняется тем, что только что произошло. После этой точки a останется независимым от своего контекста (из-за инкапсуляции), если об этом не будет сказано (это даже верно для DisplayObject - попробуйте это (var mc:MovieClip = new MovieClip(); trace( mc.root ) //this will be null).


Я сохраняю это, потому что это полезно, хотя и не полезно для вашего первоначального ответа.

Вы всегда можете получить имя класса с помощью getQualifiedClassName из пакета flash.utils. Вы не можете получить объект DisplayObject до тех пор, пока он не будет сконструирован, но вы можете смоделировать это путем (я полагаю) переопределения function set name( value:String ):void. Если это не сработает, попробуйте найти его после Event.ADDED и / или Event.ADDED_TO_SAGE.

...