1

私のクラスの 1 つのメソッドは、イベント ハンドラー関数を動的に定義しますが、そのような関数からクラスのインスタンスにアクセスする方法がわかりません。次に例を示します。

public dynamic class SomeClass
{
    public function SomeClass():void
    {
    }

    public function someMethod1():void
    {
    }

    public function someMethod2(eventType:String):void
    {
        var funcName:String = "func" + eventType;
        if (this[funcName] == null)
        {
            this[funcName] = function(event:*):void
                {
                    // this.someMethod1() is not working
                    // "TypeError: Error #1006: someMethod1 is not a function.                       
                };
        }
        this[funcName]("SOME_EVENT_TYPE");
    }
}

// ...

var instance:SomeClass = new SomeClass();
instance.someMethod2();
4

1 に答える 1

2

編集1:

あなたのコメントを読むと、よりエレガントな方法がありますthis.i keep itの使用に影響を受けましたが、使用thisは必須ではありません。あなたの場合は、thisキーワードをドロップしてメソッドを直接呼び出してください

public dynamic class SomeClass
{
    public function someMethod1():void
    {
    }

    public function someMethod2(eventType:String):void
    {
        var funcName:String = "func" + eventType;
        if (this[funcName] == null)
        {
            this[funcName] = function(event:*):void
                {
                    // just call someMethod1() it will be bound to your instance
                    someMethod1(); // here use it as you wish
                    // this.someMethod1() is not working
                    // "TypeError: Error #1006: someMethod1 is not a function.                       
                };
        }
        this.someEventDispatcher.addEventListener(eventType, this[funcName]);
    }
}

私が見たところから、イベントリスナーをアタッチするsomeEventDispatcherので、イベントが発生するとthis、イベントハンドラーが参照されsomeEventDispatcher、インスタンスではありませんSomeClass

インスタンスの参照を変数に保持できるため、イベント ハンドラーで使用できます。

public dynamic class SomeClass
{
    public function someMethod1():void
    {
    }

    public function someMethod2(eventType:String):void
    {
        var funcName:String = "func" + eventType;
        if (this[funcName] == null)
        {
            var self:SomeClass=this; // here keep the ref to your instance
            this[funcName] = function(event:*):void
                {
                    self.someMethod1(); // here use it as you wish
                    // this.someMethod1() is not working
                    // "TypeError: Error #1006: someMethod1 is not a function.                       
                };
        }
        this.someEventDispatcher.addEventListener(eventType, this[funcName]);
    }
}
于 2013-06-02T13:49:48.640 に答える