0

我在这个网站上找到了一个关于克隆对象的好教程(感谢 Andrey Popov)。我已经修改了它,创建了一个 mc 和一个文本字段。问题是我无法为 mc 和文本字段的属性设置默认值。这是我的代码:

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. 此函数返回一个具有属性的对象。但是在您的情况下,您使用了两次属性名称:

    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 回答