2013-03-05 112 views
1

我新的動作腳本OOP,我需要知道我怎麼鏈條像這個例子方法有動作腳本3靜態方法

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

首先,我需要刪除I.使用美元只簽名像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項目的例子。 – 2013-03-05 16:16:00

+0

我知道這是不好的做法,我需要知道是否有任何解決方法來解決這兩個情況,我有? – 2013-03-05 16:22:16

+0

嘗試將你使用的語言用於你習慣的隱喻(特別是當這個隱喻的大部分源於該語言的弱點而不是強項時)並不是一個好主意。但是如果你能弄清楚如何使用$作爲包或者類的名字,它將作爲一個命名空間,這就是JS的工作原理。或者,您可以將變量$設置爲包或類。 – 2013-03-05 16:26:07

回答

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(選擇器).doBla()' – 2013-03-05 18:27:54

+0

StaticTest(選擇器)對於類是不可能的 – maxmc 2013-03-05 20:42:46

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 !!!!') });