Как установить свойства клонируемого объекта?

Я нашел хороший учебник по клонированию объектов на этот сайт (спасибо Андрею Попову). Я изменил его, создал 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());
}

Как установить значения по умолчанию для экземпляров?


person nikel    schedule 20.01.2015    source источник
comment
Что ты пытаешься сделать? Клонировать объект или создать новый с начальными значениями? Вроде второй. Вы не можете иметь одно и то же свойство в объекте дважды (это то, что вы сейчас делаете: mc1: box_1_1 и mc1: Object; mc1Text: TextField и mc1Text: Object.)   -  person Fygo    schedule 20.01.2015
comment
Спасибо за ваш ответ. Я не мог понять, что вы имеете в виду, говоря о клонировании или создании совершенно нового. Может и то и другое... Какая разница? Я вижу, что вы поняли проблему в коде. Я пробовал это: sudrap.org/paste/text/502537, но это дает мне синтаксическую ошибку .   -  person nikel    schedule 20.01.2015
comment
@nikel Я не понимаю, в чем твоя проблема, потому что твой код у меня работает нормально!   -  person akmozo    schedule 20.01.2015


Ответы (2)


Я бы написал это в комментарии, но это было бы слишком долго, так что начну: вы можете создавать пустые объекты следующим образом:

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);
person Fygo    schedule 20.01.2015
comment
Спасибо за подробный ответ. - person nikel; 20.01.2015

Вы можете расширить 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;
person ozmachine    schedule 20.01.2015