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