모든 것이 객체로다
ActionScript 2 2015. 10. 30. 09:56 |다시 수년만에 as2의 세계에 입문하게 되어서... as2의 감각을 깨우기 위한 포스팅...
이런 함수가 있다고 쳐보죠...
1 2 3 4 5 6 7 8 9 10 | function a():Void { var obj = {}; Mouse.addListener(obj); obj.onMouseDown = function () { trace ( "a" ); } } |
뭐, 이것도 나쁘지 않습니다만 다음과 같이 바꿀 수 있습니다
1 2 3 4 5 6 7 8 9 10 | function a():Void { var obj = arguments.callee; Mouse.addListener(obj); obj.onMouseDown = function () { trace ( "a" ); } } |
arguments.callee 는 바로 함수객체를 가르키는 포인터입니다. 바로 "a" 라는 함수 말이죠.
이렇게 만들면 오브젝트 "obj"의 생성 비용과 그만큼의 메모리를 절약할 수 있겠지요... 게다가 심지어 a.onMouseDown 으로 접근할 수도 있기에 런타임 상에서 저 이벤트 핸들러를 접근해서 해제할 수도 있고, 다른 함수를 선언할 수도 있습니다.
다른 예도 하나 들어보겠습니다...
1 2 3 4 5 6 | var obj = {}; Stage.addListener(obj); obj.onResize = function () { trace (Stage.width + ":" + Stage.height); } |
이렇게들 많이 짜죠... 레퍼런스에 이렇게 나와있기 때문입니다.
이 코드는 다음과 같이 변경 가능합니다.
1 2 3 4 5 | Stage.addListener(Stage); Stage[ "onResize" ] = function () { trace (Stage.width + ":" + this .height); } |
보시다시피 심지어 width 와 height 가 this 로도 접근 가능하지요... 왜냐하면 this 가 바로 Stage 니깐 당연한 얘기입니다.
단, 이 코드를 다음과 같이 안 짠 이유는
1 2 3 4 5 | Stage.addListener(Stage); Stage.onResize = function () { trace (Stage.width + ":" + this .height); } |
Stage 가 네이티브 클래스 이다보니 실제 존재하지 않는 onResize 에 접근하면 컴파일시에 에러가 뜨기 때문입니다.
위의 코드와 같이 작성하면 정상 작동합니다.