2013-02-08 86 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; 
}