是否可以使用对象实例名称中的变量IN来获取对象的子项?
location_1
,location_2
是包含hidden_1
,hidden_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;
非常感谢, 尼克
答案 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;
}