代码之家  ›  专栏  ›  技术社区  ›  Chunky Chunk

actionscript-从构造函数获取实例名而不传递参数?

  •  1
  • Chunky Chunk  · 技术社区  · 14 年前

    是否可以从类中获取类的实例名,而不必手动将实例名作为字符串参数传递给类构造函数?

    //Create New SizeClass
    var big:SizeClass = new SizeClass();
    
    //-------------
    
    package
    {
    public class SizeClass
         {
         public function SizeClass()
              {
              trace( //-- Instance Name "big" --// );
              }
         }
    }
    
    2 回复  |  直到 14 年前
        1
  •  1
  •   cwallenpoole    14 年前

    不,在构造函数期间不可能知道关于包含代码块的任何信息,请保存可以从堆栈跟踪中获得的信息(尽管除了在Flash的调试器版本中,这是不可用的)。即使您有一个包含类的全局访问点,它仍然不允许该访问。

    把构造函数想象成方法调用。在AS中,它将被称为 之前 任务。如: var a:Foo = new Foo() 这个 Foo 创建(构造函数完成),然后 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 .

        2
  •  1
  •   Mark Knol    14 年前

    实例名不太重要。您最好将实例的引用存储在数组中。

    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/