상상 너머 그 무언가...

Object.constructor 객체 인스턴스의 클래스 객체에 대한 참조 본문

개발관련(Development)/플래시(Flash)

Object.constructor 객체 인스턴스의 클래스 객체에 대한 참조

Clack 2013. 9. 10. 11:41

flashbuilder로 모바일 air 프로젝트를 진행하는 과정에서

안드로이드용 개발에서는 패키지 외에 외부 swf를 로드하고 로드된 swf 에 있는 각종 무비클립, 이미지, 클래스 등등을

가져다 쓸 수 있었는데

iOS용으로 추가 개발하는 과정에서 문제가 생겼다.


 iOS Air Player는 외부 swf를 로드는 가능하나 AS Linkage가 설정되어 있는 클립이 있거나

액션스크립트가 한줄이라도 포함되어 있는경우 알림창이 뜨면서 지원을 하지 않는다는 내용을 보여줬다.


그래서 다른 방법은 없을까 하고 알아본것은 

root 스테이지에 있는 객체에 접근해서 constructor 속성을 이용해 해당 객체의 클래스를 참조해서 사용하는것이였다.


Adobe ActionScript 3 API 설명서에는 아래와 같이 나와있다.

constructor

속성
public var constructor:Object

런타임 버전: Flash Player 9, Flash Lite 4, Flash Player 9, AIR 1.0

지정된 객체 인스턴스의 클래스 객체 또는 생성자 함수에 대한 참조입니다. 객체가 클래스의 인스턴스인 경우 constructor 속성에는 클래스 객체에 대한 참조가 저장됩니다. 생성자 함수를 사용하여 객체를 만든 경우 constructor 속성에는 생성자 함수에 대한 참조가 저장됩니다. 생성자 함수는 클래스의 생성자 메서드와 다릅니다. 생성자 함수는 객체를 만드는 데 사용되는 Function 객체이고 class 키워드를 사용하여 클래스를 정의하는 대신 사용할 수 있습니다.

하지만 이것 또한 실패했다.



constructor 속성을 이용해서 해당객체만의 class를 얻기 위해선 해당 객체에 액션스크립트가 포함되어 있어야 했다.

액션스크립트가 한줄이라도 내부에 포함하고 있는 객체의 경우 constructor 속성값이 해당 객체 심볼이름으로 클래스가 들어있지만

액션스크립트를 포함하고 있지 않는 객체의 경우 constructor 속성값에 부모클래스인 MovieClip가 들어있었다.


var target: MovieClip = this.target_mc;   // 액션스크립트 포함함 무비클립

var clipClass: Class = Object( target ).constructor;
trace( clipClass );   //  출력결과 : [class Symbol2_1]

var clip: Object = new clipClass();
var clip_mc: MovieClip = clip as MovieClip;

clip_mc.x = 200;
clip_mc.y = 200;
this.addChild( clip_mc  );

var clip2_mc: MovieClip = new clipClass() as MovieClip;

clip2_mc.x = 300;
clip2_mc.y = 300;
this.addChild( clip2_mc );

var tri: MovieClip = this.triCircle_mc;  // 액션스크립트가 없는 무비클립

var triClass: Class = Object( tri ).constructor;
trace( "triClass = ", triClass );  // 출력결과 :  triClass =  [class MovieClip]



iOS의 경우 로드된 swf가 액션스크립트가 포함되어 있으면 알림창이 뜨고 모든 액션스크립트는 인식되지 않기되기 때문에

iOS에서는 constructor를 사용해서 심볼 고유의 class를 구해서 재사용할 방법은 없다는 결론이 나왔다.