2

as3には、オブジェクトインスタンスを呼び出すときにオブジェクトインスタンスを変更する柔軟な方法があります。Functionオブジェクトのメンバーの呼び出しまたは適用は、特定の最初の引数を使用して呼び出すことができます。参照によると、この最初の引数は関数内の「this」ポインターになります。しかし、私はそれが間違っていることに気づきました。

以下にリストされている小さなテストを書きます。

public class Test 
{
  private var name:String = "default";
  public var test3:Function = test;
  public var test2:Function = function()
  {
    trace(this.name);
  }

  public function Test(name:String) 
  {
    this.name = name;
  }

  public function test():void
  {
    trace(this.name);
  }
}

そしてそれをテストしました。

var tmp:Test = new Test("default");
tmp.test();  //out default
tmp.test.call(new Test("new"));  //out default

tmp.test2(); //out default
tmp.test2.call(new Test("new2")); //out new2

tmp.test3(); //out default
tmp.test3.call(new Test("new3")); //out default

したがって、無名関数呼び出しでは正しい出力を取得できますが、メンバー関数の場合は取得できません。多分それは曖昧な「this」ポインタのせいで、正しい作業のために実際のオブジェクトインスタンスを参照するはずです。私は今はしません、そしてas3リファレンスはそれについてのsmthを説明していませんでした。

最後に質問のリスト:

  1. なぜそうなのか?私には、それは非常に奇妙で、未定義の動作のように見えます。
  2. どうすればその機能を実現できますか?匿名のようにテスト機能を欺く方法は?methode targetと呼ばれていませんか?

それほど重要ではありませんが、良い答えがあれば嬉しいです。ありがとう!

PS私の英語でごめんなさい。

//編集済み:このステートメントをすべての「名前」参照に追加しました。何も変わりません。

4

1 に答える 1

2

[[Call]]プロパティを呼び出すと、クロージャの種類によって動作が異なります。クロージャはメソッドへの参照を含むオブジェクトであり、[[Call]]プロパティは、それが関数、メソッド、またはクラスクロージャのいずれであるかによって動作が異なります。関数クロージャは、クラスのどのインスタンスにも関連付けられていないグローバルメソッドのものです。メソッドクロージャにはクラスのインスタンスメソッドが含まれており、常に元の「this」値を記憶しています。

クロージャが関数クロージャの場合、[[Call]]に渡された最初の引数はメソッドに渡され、「this」値として使用されます。最初の引数がnullまたは未定義の場合、グローバルオブジェクトがメソッドの「this」値として使用されます。

クロージャがメソッドクロージャの場合、[[Call]]の最初の引数は無視され、メソッドクロージャに保存された「this」値が最初の引数としてメソッドに渡されます。メソッドクロージャは、元の「this」値が何であったかを記録し、[[Call]]の最初の引数の代わりに常にそれを使用します。

クロージャがクラスクロージャであり、[[Call]]に渡される引数が1つある場合(「this」引数に加えて)、呼び出しは型変換として扱われ、引数は型に強制変換されますクロージャによって表されます。

http://learn.adobe.com/wiki/display/AVM2/2.4+Method+invocation+notes

于 2012-08-16T00:30:11.053 に答える