0

オブジェクトインスタンス名に変数を持つオブジェクトの子を取得することは可能ですか?

location_1、MCなどをlocation_2含むMCです。hidden_1hidden_2

そして、理想的には、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 に答える