2013-03-05 2 views
1

나는 액션 스크립트 OOP에 새로운 그리고 난 내가 달러를 사용하도록 I.를 제거해야 내가액션 스크립트 3 정적 메서드

I.$(button).bind('click',clickButton).bind('rollover',overButton).bind('rollout',outButton)

먼저이 방법을 체인 방법이 예와 같이 알 필요가 jQuery와 같은 서명 : MovieClip을 선택하고 그 위에 두 번째 문제를 적용합니다.이 방법은 정적 메서드를 사용하고 있기 때문입니다. 메서드 - 스크립트 제한은 정적 속성 만 사용하여 마지막 동작을 호출 한 개체를 저장합니다. 어떤 의미인지 알 수있는 클래스 코드 :

package com.MAIN 
{ 
    import flash.display.Sprite; 
    import flash.events.MouseEvent; 

    public class I extends Sprite 
    { 
     private static var cSelector:Sprite; 

     public static function $(selector:Sprite) 
     { 
      cSelector = selector 
      return I; 
     } 

     public static function alpha(val:Number) 
     { 
      cSelector.alpha = val; 
      return I; 
     } 

     // bind mouse event to the element 
     public static function bind(EventStr,func:Function) 
     { 
      var func1:Function = function(e:MouseEvent){ 
       func(cSelector); 
      } 
      // select the event from the list 
      if(typeof(EventStr) == 'string'){ 
       // map the events in lowercase 
       var events:Object = {click:'CLICK',rollover:'ROLL_OVER',rollout:'ROLL_OUT',dblclick:'DOUBLE_CLICK',mousedown:'MOUSE_DOWN',mousemove:'MOUSE_MOVE',mouseout:'MOUSE_OUT',mouseover:'MOUSE_OVER',mouseup:'MOUSE_UP',mousewheel:'MOUSE_WHEEL'}; 
       // check if the event exists in the list 
       if(events[EventStr] && MouseEvent[events[EventStr]]){ 
        cSelector.addEventListener(MouseEvent[events[EventStr]],func1); 
       } 
      }else if(typeof(EventStr) == 'object'){ 
       // add the event 
       cSelector.addEventListener(EventStr,func1); 
      } 
      return I; 
     } 

     public static function remove() 
     { 
      cSelector.parent.removeChild(cSelector); 
      return I; 
     } 

    } 
} 
+1

정적 proerties 및 방법 [나쁜 연습]입니다 (http://misko.hevery.com/code-reviewers- 가이드/결함 - 취성 - 글로벌 - 상태 - 싱글 톤 /). 플 렌트 API를 만들려면 각 메서드는 메서드가있는 동일한 형식의 개체를 반환해야합니다. 예제를 위해 오픈 소스 Mockalate 프로젝트를 확인하십시오. –

+0

나는 이것이 나쁜 상황에 처해 있다는 것을 안다. 나는이 두 가지 상황을 해결할 수있는 해결 방법이 있는지 알아야 할 필요가있다. –

+0

익숙한 은유로 사용하고있는 언어를 구속하는 것은 좋은 생각이 아닙니다. (특히 은유의 상당 부분이 언어의 약점이 아니라 강점에서 비롯된 경우). 그러나 $를 패키지 또는 클래스 이름으로 사용하는 방법을 알아낼 수 있다면 이름 공간으로 작동 할 것입니다. 이것이 네임 스페이스로서 JS에서 어떻게 작동 하는지를 보여줍니다. 또는 변수 $를 패키지 또는 클래스로 설정할 수 있습니다. –

답변

1

이처럼 시도 할 수 있습니다 : 여기

interface Test { 
    function doBla(): Test 
    function moreBla(): Test 
} 

public class StaticTest { 
    private static const instance: Test = new InternalTest() 

    public static doBla() : Test { 
    return instance.doBla(); 
    } 

    public static moreBla() : Test { 
    return instance.moreBla(); 
    } 
} 

internal class InternalTest implements Test { 
    function doBla(): Test { 
    trace("bla"); 
    return this; 
    } 

    function moreBla(): Test { 
    trace("more bla"); 
    return this; 
    } 
} 
+0

나는이 방법으로 그것을 써야한다 : 'StaticTest.doBla()'StaticTest (selector) .doBla()' –

+0

'StaticTest (selector)'는 클래스와 함께 할 수 없다. – maxmc

2

당신이 올바른 방향으로 몇 가지 단계, 이동합니다. 그러나 이것은 정말로, 정말로, 정말로 진절머리 나는 생각입니다. 당신이 이들의 구체적인 구현을 만든 후에

//$.as 
package 
{ 
    import flash.display.DisplayObject; 

    //NOTE: there's NO class definition 

    public function $(selector : DisplayObject) : IDisplayObject 
    { 
     //traverse displaylist to find <code>selector</code> 
     //and return an instance of IDisplayObject that holds the reference   
    } 
} 

//IDisplayObject.as 
package 
{ 
    public interface IDisplayObject{ 
     function alpha(value : Number) : IBinding; 
    } 
} 

//IBinding.as 
package jquery 
{ 
    public interface IBinding{ 
     function bind(eventName : String, callback : Function, ...parameters):void; 
    } 
} 

당신은 할 수 있습니다 :

$(someMC).alpha(.5).bind('click', function(){ trace('what a miraculously crappy idea !!!!') });