0

このサイトで、オブジェクトの複製に関する優れたチュートリアルを見つけました(Andrey Popov に感謝)。私はそれを修正し、mc と textfield を作成しました。問題は、mc と textfield のプロパティにデフォルト値を設定できないことです。これが私のコードです:

var getReadOnlyValues:Function = function():Object { return {
    mc1: new box_1_1(),
    mc1: {
        name: "mc1_",
        alpha: 1,
        x: 0,
        y: 0,
        width: 30,
        height: 25
    },
    mc1Text: new TextField(),
    mc1Text: {
        text: "test",
        x: 100.60,
        y: 80.50,
        selectable: false,
        multiline: false,
        wordWrap: false,
        defaultTextFormat: caption_tf
    }
}};

function addBoxes() {
    var copyOne:Object = getReadOnlyValues();
    copyOne.mc1.alpha = 1;
    copyOne.mc1.x = num;
    copyOne.mc1.width = 200;

    addChild(copyOne.mc1);
    copyOne.mc1.addEventListener(MouseEvent.CLICK, onCaptionClick);

    copyOne.mc1.addChild(copyOne.mc1Text);
    copyOne.mc1Text.text = "test_" + num;
    copyOne.mc1Text.x = num;

    // traceObj(copyOne);
    // traceObj(getReadOnlyValues());
}

インスタンスのデフォルト値を設定するにはどうすればよいですか?

4

2 に答える 2

1

私はこれをコメントに書いたでしょうが、長すぎるのでここに行きます: 次のように空のオブジェクトを作成できます:

var o1:Object = new Object(); //empty object with constructor call
var o2:Object = {}; //this is an empty object with object literal

次に、プロパティをオブジェクトに割り当てることができます。

o1.abc = "This is my abc string";
o1["abc"] = "This is my abc string"; //the same as above

オブジェクト リテラルを使用してオブジェクトを作成する場合、作成時にすぐにプロパティを割り当てることができます (これはコンストラクター呼び出しでは不可能です)。

var o:Object = {
   prop1: "My prop",
   myMc: new Movieclip()
}

と呼ばれるあなたの関数を取り上げますgetReadOnlyValues。この関数は、プロパティを持つオブジェクトを返します。しかし、あなたの場合、プロパティ名を2回使用しています:

    mc1: new box_1_1(),
    mc1: {
        name: "mc1_",
        alpha: 1,
        x: 0,
        y: 0,
        width: 30,
        height: 25
    }

それは正しくありません。プロパティ名は一意である必要があります (基本的に文字列識別子であるため)。また、mc1 を再度「設定」しようとすると、オブジェクト リテラル ( {}) とプロパティを使用して、このプロパティに別のオブジェクト (!) を割り当てようとすることにも注意してください。しかしそれだけです。このオブジェクトはインスタンスとは何の関係もなく、box_1_1単なる独立したオブジェクトになります。テキストフィールドと同じです。異なるクラスのインスタンスに値を設定する場合は、別の方法で設定する必要があります。これは、オブジェクトの値をムービークリップに「何もないところから」関連付けることができないためです。これを行う方法の例を次に示します (これは、オブジェクトとプロパティの概念を説明するためのものです)。

var o1 = {
    mc: new MovieClip(),
    mcSettings: {
        x: 100,
        y: 300,
        alpha: 0.5
    }
}

var o2:Object = {
    mc: new MovieClip(),
    mcSettings: {
        x: 1,
        y: 2,
        alpha: 0.3
    }
}

function setValues(o:Object):void {
    var mc:MovieClip = o.mc;
    var settings:Object = o.mcSettings;
    for(var i:String in settings) {
        mc[i] = settings[i]; //would be mc["x"] = 100, mc["y"] = 300, mc["alpha"] = 0.5 for o1
    }

    trace(mc.x, mc.y, mc.alpha);
}

setValues(o1);
setValues(o2);
于 2015-01-20T18:55:24.980 に答える
1

MovieClip と TextField を拡張し、そこでデフォルト値を定義できます...

package
{
    import flash.display.MovieClip;

    public class MyMovieClip extends MovieClip
    {
        public function MyMovieClip()
        {
            super();

            x = 10;
            y = 10;
            name = "testName";
        }
    }
}

次に、後で作成すると、それらの値は構築時に定義されます...

var myMovie:MovieClip = new MyMovieClip as MovieClip;
于 2015-01-20T19:33:59.640 に答える