1

複雑なクラスから抽出されたおもちゃの例を次に示します。

public class MyClass {
    public function MyClass() {
         trace('Created');
    }

    public static function makeObjectAsync(callback:Function):void {
        inner();

        function inner():void {
            var object:MyClass = new MyClass(); // line 10
            callback(object);
        }
    }
}

静的関数を呼び出した後:

MyClass.makeObjectAsync(function(object:Myclass):void { ... })

次の実行時例外が 10 行目で発生します。

TypeError: Error #1007: Instantiation attempted on a non-constructor.

これはなぜですか?どうすればよいですか?

編集

動作するようnew (MyClass)()です。今、私はおそらくもっと混乱しています。

4

2 に答える 2

1

正直なところ、WHYについてはあまり明確ではありません。宣言方法に応じて、無名関数によって継承されるスコープと関係があります。

ただし、2つの解決策があります。

  1. makeObject メソッドが静的でない場合は、機能します。

  2. 匿名関数を別の方法で宣言します。

    public static function makeObjectAsync(callback:Function):void {
        var inner : Function = function():void {
            var object:MyClass = new MyClass();
            callback(object);
        };
    
        inner();
    }
    
于 2012-08-24T16:49:15.423 に答える
0

変数を「オブジェクト」と呼ぶべきではありません。内部関数をネストしたのはなぜですか? 次のことをしてみませんか。

public static function makeObjectAsync(callback:Function):void {
    callback(new MyClass());
}

または、ネストされた関数が本当に必要な場合:

public static function makeObjectAsync(callback:Function):void {
    inner();

    function inner():void {
        callback(new MyClass());
    }
}

また、クラスのコンストラクターを再度呼び出すことはできません。コンストラクターで呼び出される関数を使用してから、再度呼び出します。これにより、コンストラクターを参照するのではなく、クラスの新しいインスタンスを作成します。

于 2012-08-24T16:20:38.153 に答える