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を説明していませんでした。
最後に質問のリスト:
- なぜそうなのか?私には、それは非常に奇妙で、未定義の動作のように見えます。
- どうすればその機能を実現できますか?匿名のようにテスト機能を欺く方法は?methode targetと呼ばれていませんか?
それほど重要ではありませんが、良い答えがあれば嬉しいです。ありがとう!
PS私の英語でごめんなさい。
//編集済み:このステートメントをすべての「名前」参照に追加しました。何も変わりません。