2013-03-05 77 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 !!!!') });