2013-02-08 85 views
0

是否可以在对象实例名称中获取包含变量的对象的子对象?对象名称中的变量

location_1location_2是包含hidden_1hidden_2管委会等

MCS和我非常喜欢里面增加整数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

取出'this'。但是为什么当数组更容易处理时,你想这样做呢? – David 2013-02-08 17:23:57

+0

loc_mc [“location_1”] [“hidden_​​1”]是否存在? – 2013-02-08 17:24:13

+0

'location_1'是一个包含'hidden_​​1','hidden_​​2'等的MC。请看清晰的问题 - 应该更清楚。 – 2013-02-08 17:26:18

回答

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)] 

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

+0

谢谢!理解: 'var locMc = this [“location _”+(i + 1)]; trace(locMc [“hidden_​​”+(cacheNum + 1)]);' – 2013-02-08 17:40:00

+0

添加了一个类似于您的请求的示例。 – BoppreH 2013-02-08 17:42:43

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; 
}