2014-05-15 7 views
0

Я объект содержит все типы данныхAS3 клонировать объект

var obj1:Object={boo:true,num:0,str:"me",arr:[0,"me2",[0,1]],mc:myMc,obj:{boo:false,num:0,str:"me3",arr:[0,"me4",[0,1]]}}; 

, когда я клонировать этот объект obj2 используя ByteArray с writeObject(obj1) & readObject() свойствами, все в порядке, за исключением obj2.mc (тс является переменная, которая удерживает связь фрагмента ролика в библиотеке, класс которой установлен в myMc) не может быть добавлен на этап,

addChild(new obj2.mc) 
//TypeError: Error #1007: Instantiation attempted on a non-constructor. 

Помогите пожалуйста!

+1

, что не должно быть новым obj2.mc()? – StephenNYC

+1

Скобки не нужны при создании экземпляра, это не проблема. –

ответ

0

Ребята После 2 часов экспериментов я вышел с этим, это просто идеальное решение ... Я изменил его на другой способ, чем используя ByteArray, который записывает каждую переменную в obj2 в соответствующее значение в obj1, но столкнулся с другой проблемой: когда я меняю массивы в obj2, я обнаружил, что массивы в obj1 тоже изменены, это означает, что при записи переменных obj2 массивы ссылаются только на объекты obj1 .. поэтому мне пришлось перебирать массивы для записи каждого значения в массиве индивидуально ..

var obj1:Object={mc:myMc,bo:true,num:0,str:"me",arr:[myMc,true,0,"me2",[0,1,[0,1]]],obj:{mc:myMc,bo:false,num:0,str:"me3",arr:[myMc,true,0,"me4",[0,1]]}}; 
var obj2:Object=clone(obj1); 

function clone(source:Object):* { 
    var myOBJ:Object=new Object(); 
    for (var property in source) { 
     if (source[property] is Array) { 
      myOBJ[property]=clone(source[property]); 
     } else { 
      myOBJ[property]=source[property]; 
     } 
    } 
    return (myOBJ); 
} 

Спасибо за все, ты вдохновила меня ..

+2

Hm, если вам не нужен ByteArray, тогда я бы настоятельно рекомендовал использовать шаблон дизайна Factory :) Это был бы просто класс, который создает такой ваш объект и, таким образом, он может создавать идентичные объекты. В любом случае, теперь я понимаю вашу идею и ваше решение, поскольку прохождение через свойства довольно прямолинейно и, таким образом, правильно :) Приветствия, удовольствие лучше всего, когда вы находите решение самостоятельно! :) –

+0

моя проблема в том, что я хорошо разбираюсь во скриптах во Flash напрямую, я не знаю, как использовать классы или манипулировать ими свободно, и я предпочитаю, чтобы мой проект был всего одним файлом, никаких файлов внешних классов .. вот и все .. – Power

+0

О, я понимаю .. Но я бы посоветовал потратить неделю или две, чтобы проверить, как работают классы и как их проектировать, - вам будет намного легче :) –

1

Вы не можете дублировать клипы, которые легко. Это должно быть примерно так:

var objectClass:Class = Object(obj2.mc).constructor; 
var instance:MovieClip = new objectClass() as MovieClip; 

Было бы намного проще, если бы вы передали класс, а не экземпляр. В вашем случае это должно быть myMc - имя класса объекта, находящегося в библиотеке, не так ли?

Если да, то вы можете просто создать его экземпляр непосредственно: var instance:MovieClip = new myMc();

Важно думать, чтобы помнить о том, что вам не нужно держать ссылку на экземпляр, но класс вместо этого!

+0

Да, объект находится в библиотеке, а его класс - myMc, и да, опять-таки, мне не нужно содержать ссылку на экземпляр типа mc в obj1, поэтому я могу использовать addChild (new myMc) напрямую, но причина Я ссылался на myMc на mc, так это то, что в моем проекте есть несколько объектов obj1, obj2, ob3 и т. Д. Каждый содержит mc и каждый mc ссылается на другой класс MovieClip, поэтому, когда я вызываю addChild (новый obj.mc), результаты легко получаются. – Power

Смежные вопросы