对象名称中的变量

时间:2013-02-08 17:21:38

标签: actionscript-3 variables for-loop

是否可以使用对象实例名称中的变量IN来获取对象的子项?

location_1location_2是包含hidden_1hidden_2 MC等的MC。

理想情况下,我希望在for循环中使用增加的整数来定位隐藏的对象。为了便于阅读,我删除了for循环:

var i = 0;
var cacheNum = 0;    

var locMc = this["location_"+(i+1)]; // This works
var hiddenMc = locMc.this["hidden_"+(cacheNum+1)]; // This doesn't work!

我最理想的是:

var i = 1;
var cacheNum = 1;

var hiddenMc = location_i.hiddenMc_cacheNum;

非常感谢, 尼克

2 个答案:

答案 0 :(得分:2)

按名称访问对象的语法与按数字访问的数组相同:

object[value];

对于数组,值为数字:

var myArray:Array = ["a", "b", "c"];
myArray[0]; // "a"

如果是对象,则该值为字符串:

var myObject:Object = {"a": 1, "b": 2, "c": 3}
myObject["a"] // 1

访问当前对象中的变量时,必须使用this,如示例所示。但是当使用不同的对象时,您只需直接使用括号表示法:

var hiddenMc = locMc["hidden_"+(cacheNum+1)];

如果对象是DisplayObjectContainer(如Sprite或MovieClip)并且您正在访问的值是子级(如您的情况),您还可以使用getChildByName方法:

var hiddenMc = locMc.getChildByName("hidden_"+(cacheNum+1));

与任何表达式一样,您可以通过这种方式对访问进行字符串访问:

this["location_"+(i+1)]["hidden_"+(cacheNum+1)]

但正如您所看到的,这是不可读的并且非常容易出错。最好的方法是将那些隐藏的MC存储在一个数组中并从那里访问它们。它简化了代码,因为在访问它们时不需要附加“hidden_​​”,通常更快,并且永远不会与具有相似名称的其他子代冲突。

答案 1 :(得分:1)

您试图通过允许代码操纵对象的内部工作来绕过封装。这样做是你自己的危险。相反,为外部对象提供某种有限的访问方式,或者能够让代表包含这些值的对象代表调用者对它们执行工作:

public class Hidden()
{
    private var _hiddenValue:int = 5;
    public function get hiddenValue():int
    {
        return _hiddenValue;
    }
    public function screwWithTheHiddenValue():void
    {
        _hiddenValue += 25;
    }
}

public class Nosey()
{
    var hidden:Hidden = new Hidden();
    var result:int = hidden.hiddenValue;
    // result should be 5
    hidden.screwWithTheHiddenValue();
    result = hidden.hiddenValue;
    // result should now be 30;
}