2009-09-10 92 views
0

我清楚地失去了一些東西。AS3動態類的動態方法名稱

我需要從陣列(見下面的傻例子)填充動態AS3類的方法。

但是當我調用這些方法,所有這些似乎是同樣的方法。在下面的例子中,所有的方法都是foobar1

如果我手動創建方法,沒有環,一切都很好。

任何線索?

package foo 
    { 
    public class Bar 
    { 
     public function testDynamicClassSanity():void 
     { 
     var foo:Foo = new Foo(); 
     var methods:Object = { foobar1: 101, foobar2: 201, foobar3: 301 }; 

     for (var key:String in methods) 
     { 
      var val:Number = methods[key]; 
      foo[key] = function():Number 
      { 
      return val; 
      }; 
     } 

     // Next trace prints 
     // 101 = 101 201 = 101 301 = 101 
     trace(
      101, "=", foo.foobar1(), 
      201, "=", foo.foobar2(), 
      301, "=", foo.foobar3() 
     ); 
     } 
    } 
    } 

    internal dynamic class Foo 
    { 
    }; 

回答

4

我想這個問題是在val作用域 - 你認爲它的範圍是在for循環,而不是在AS3的情況下,範圍的功能。我確定所有的電話都返回301嗎?

更新:解決您遇到的問題(變量val被引用,只有稍後解決而不是被「複製」到您的函數中)非常麻煩:根據您的用例,您可以檢查方法調用而只是仰望所需的結果,使用Proxy提供的功能表。

+0

是的,你是正確的(幾乎是101)。我已經更新了這個問題。那麼如何解決這個問題呢? –

+1

啊,我是假設的for循環遍歷定義它們的順序對象的屬性,那當然是愚蠢的假設:-)檢查該另一個問題http://stackoverflow.com/questions/422784/如何修復 - 關閉 - 問題在actionscript-3-as3的提示。 –

2

我覺得你的問題是var變量的作用域。試試這個修改:

for (var key:String in methods) 
{ 
    var val:Number = methods[key]; 
    foo[key] = function (valInternal:Number) { 
    return function():Number 
    { 
     return valInternal; 
    }; 
    }(val); 
} 

(上述伎倆在JavaScript的作品要解決類似的問題。我敢打賭,這是適用於AS3)

+0

我相信它應該是「迴歸valInternal」,對不對? –

+0

是的,固定..... – jsight

1

對於記錄,我會在這裏發佈修正版本的testDynamicClassSanity()功能:

public function testDynamicClassSanity():void 
    { 
     var foo:Foo = new Foo(); 
     var methods:Object = { foobar1: 101, foobar2: 201, foobar3: 301 }; 

     // We have to introduce new scope 
     var makeCallback:Function = function(result:Number):Function 
     { 
     return function():Number 
     { 
      return result; 
     } 
     } 

     for (var key:String in methods) 
     { 
     foo[key] = makeCallback(methods[key]) 
     } 

     // Prints as intended 
     // 101 = 101 201 = 201 301 = 301 
     trace(
      101, "=", foo.foobar1(), 
      201, "=", foo.foobar2(), 
      301, "=", foo.foobar3() 
     ); 
    }