0

是否可以通过对象实例名称中的变量获取对象的子对象?

location_1,location_2是包含hidden_1, hidden_2MC 等的 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;

非常感谢,尼克

4

2 回答 2

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_​​”,通常更快,并且永远不会与其他具有相似名称的孩子发生冲突。

于 2013-02-08T17:35:01.630 回答
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;
}
于 2013-02-14T22:15:34.803 回答