2015-01-20 3 views
0

this 사이트 (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()); 
} 

인스턴스의 기본값을 어떻게 설정할 수 있습니까?

+0

? 객체를 복제하거나 초기 값을 사용하여 새 객체를 만듭니다. 두 번째 것 같습니다. 한 개체에 두 번 같은 속성을 사용할 수 없습니다 (현재 mc1 : box_1_1 및 mc1 : Object, mc1Text : TextField 및 mc1Text : Object). – Fygo

+0

답장을 보내 주셔서 감사합니다. 나는 "새로운 것을 복제하거나 창조하는 것"이라고 말하면 무슨 뜻인지 이해할 수 없었다. 어쩌면 둘 다 ... 차이점은 무엇입니까? 나는 당신이 코드의 문제를 이해했음을 안다. 나는 이것을 시도했다 : http://sudrap.org/paste/text/502537/ 구문 오류가 발생했다. – nikel

+0

@nikel 코드가 잘 작동하기 때문에 어떤 문제인지 이해할 수 없습니다! – akmozo

답변

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 

, 당신은 (이 생성자 호출 할 수 없습니다) 바로 생성시 속성을 assing 수 있습니다

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); 
+0

자세한 답변 해 주셔서 감사합니다. – nikel

1

당신은 무비 클립 및 텍스트 필드를 확장하고, 거기에 기본 값을 정의 할 수 있습니다 ...

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; 
관련 문제