Actionscript 3 如何设置克隆对象的属性?

Actionscript 3 如何设置克隆对象的属性?,actionscript-3,flash,flash-cc,Actionscript 3,Flash,Flash Cc,我在网站上找到了一个关于克隆对象的好教程(多亏了安德烈·波波夫)。我修改了它,创建了一个mc和一个文本字段。问题是我不能为mc和textfield的属性设置默认值。这是我的密码: var getReadOnlyValues:Function = function():Object { return { mc1: new box_1_1(), mc1: { name: "mc1_", alpha: 1, x: 0, y

我在网站上找到了一个关于克隆对象的好教程(多亏了安德烈·波波夫)。我修改了它,创建了一个mc和一个文本字段。问题是我不能为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());
}

如何为实例设置默认值?

我本来会将其写入注释中,但它太长,因此我选择: 可以创建空对象,如下所示:

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
如果使用对象文字创建对象,则可以在创建时立即分配属性(这在构造函数调用中是不可能的):

我现在将使用名为
getReadOnlyValues
的函数。此函数返回具有属性的对象。但在您的案例中,您使用了两次属性名称:

    mc1: new box_1_1(),
    mc1: {
        name: "mc1_",
        alpha: 1,
        x: 0,
        y: 0,
        width: 30,
        height: 25
    }
这是不对的。属性名称必须是唯一的(因为它们基本上是字符串标识符)。还请注意,当您再次尝试“设置”mc1时,您将尝试使用对象文字(
{}
)和属性为该属性分配另一个对象(!)。但就是这样,这个对象与您的
box\u 1\u 1
实例无关,它只是一个独立的对象。文本字段也是如此。如果您想为不同类的实例设置值,则需要以其他方式进行设置,因为您不能仅将对象中的一些值与movieclip“凭空”关联。下面是一个示例(请注意,这只是为了解释对象和属性的概念):


您可以扩展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;

你想干什么?克隆一个对象或创建一个具有初始值的全新对象?似乎是第二个。对象中不能有两次相同的属性(这就是您当前正在执行的操作:mc1:box_1_1和mc1:object;mc1Text:TextField和mc1Text:object)。谢谢您的回答。我不明白你说的“克隆或创造一个全新的”是什么意思。也许两者都。。。有什么区别?我知道你在代码中理解了这个问题。我试过这个:但它给了我语法错误。@nikel我不明白你的问题是什么,因为你的代码对我来说很好!谢谢你的详细回答。
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;