public __resolve : Object
ActionScript コードが未定義のメソッドまたはプロパティを参照する場合に自動的に呼び出されるユーザー定義関数への参照です。ActionScript コードがオブジェクトの未定義のプロパティまたはメソッドを参照する場合、Flash Player はオブジェクトの __resolve プロパティが定義されているかどうかを判断します。__resolve が定義されている場合、参照先の関数が実行され、未定義のプロパティまたはメソッドの名前が渡されます。これにより、プロパティまたはメソッドが実際に定義された場合と同じように、未定義のプロパティの値および未定義のメソッドのステートメントをプログラムによって提供できます。このプロパティは、クライアント/サーバー間で非常に透過的なやり取りが行われるようにする場合に有用であり、サーバーサイドメソッドを呼び出す方法として推奨されています。
次の例は最初の例から段階的に構築されており、__resolve プロパティの 5 とおりのシンタックスを示します。わかりやすくするために、前のシンタックスと異なるキーステートメントは太字になっています。
シンタックス 1 : 次の例では、__resolve を使用し、未定義のプロパティがそれぞれ "Hello, world!" という値を返すオブジェクトを構築しています。
// 新しいオブジェクトをインスタンス化します
var myObject:Object = new Object();
// __resolve 関数を定義します
myObject.__resolve = function(name) {
return "Hello, world!";
};
trace (myObject.property1); // 出力 : Hello, world!
trace (myObject.property2); // 出力 : Hello, world!
シンタックス 2 : 次の例では、__resolve をファンクター (関数を生成する関数) として使用しています。__resolve を使用することで、未定義のメソッドの呼び出しが、myFunction という名前の汎用関数にリダイレクトされます。
// 新しいオブジェクトをインスタンス化します
var myObject:Object = new Object();
// __resolve で呼び出す関数を定義します
myObject.myFunction = function(name) {
trace("Method "+name+" was called");
};
// __resolve 関数を定義します
myObject.__resolve = function(name) {
return function () { this.myFunction(name); };
};
// 未定義のメソッド名を使用して __resolve をテストします
myObject.someMethod(); // 出力 : Method someMethod was called
myObject.someOtherMethod(); // 出力 : Method someOtherMethod was called
シンタックス 3 : 次の例は、前の例を基にして構築されており、解決されたメソッドをキャッシュに保存する機能を追加しています。メソッドをキャッシュに保存すると、__resolve は各メソッドに対して 1 回だけ呼び出されます。したがって、オブジェクトメソッドの遅延構築が可能です。遅延構築は、メソッドが最初に使用されるときまで、メソッドの作成 (構築) を延期する最適化技術です。
// 新しいオブジェクトをインスタンス化します
var myObject:Object = new Object();
// __resolve で呼び出す関数を定義します
myObject.myFunction = function(name) {
trace("Method "+name+" was called");
};
// __resolve 関数を定義します
myObject.__resolve = function(name) {
trace("Resolve called for "+name); // __resolve が呼び出されたタイミングをチェックします
// 関数を呼び出すだけでなく、関数への参照を保存します
var f:Function = function () {
this.myFunction(name);
};
// 新しいオブジェクトメソッドを作成し、参照を代入します
this[name] = f;
// 参照を返します
return f;
};
// 未定義のメソッド名を使用して __resolve をテストします
// __resolve は各メソッド名に対して 1 回だけ呼び出されます
myObject.someMethod(); // __resolve を呼び出します
myObject.someMethod(); // __resolve は定義されているので、呼び出されません
myObject.someOtherMethod(); // __resolve を呼び出します
myObject.someOtherMethod(); // __resolve は定義されているので、呼び出されません
シンタックス 4 : 次の例は前の例を基にして構築されており、メソッド名 onStatus() をローカルで使用するために予約し、他の未定義のプロパティと同じ方法で解決されないようにしています。追加されたコードは太字になっています。
// 新しいオブジェクトをインスタンス化します
var myObject:Object = new Object();
// __resolve で呼び出す関数を定義します
myObject.myFunction = function(name) {
trace("Method "+name+" was called");
};
// __resolve 関数を定義します
myObject.__resolve = function(name) {
// ローカルで使用するために "onStatus" という名前を予約します
if (name == "onStatus") {
return undefined;
}
trace("Resolve called for "+name); // __resolve が呼び出されたタイミングをチェックします
// 関数を呼び出すだけでなく、関数への参照を保存します
var f:Function = function () {
this.myFunction(name);
};
// 新しいオブジェクトメソッドを作成し、参照を代入します
this[name] = f;
// 参照を返します
return f;
};
// メソッド名 "onStatus" を使用して __resolve をテストします
trace(myObject.onStatus("hello"));
// 出力 : undefined
シンタックス 5 : 次の例は前の例を基にして構築されており、パラメータを受け入れるファンクターを作成しています。この例では、arguments オブジェクトのシンタックスを拡張し、Array クラスのメソッドをいくつか使用しています。
// 新しいオブジェクトをインスタンス化します
var myObject:Object = new Object();
// __resolve で呼び出す汎用関数を定義します
myObject.myFunction = function(name) {
arguments.shift();
trace("Method " + name + " was called with arguments: " + arguments.join(','));
};
// __resolve 関数を定義します
myObject.__resolve = function(name) {
// ローカルで使用するために "onStatus" という名前を予約します
if (name == "onStatus") {
return undefined;
}
var f:Function = function () {
arguments.unshift(name);
this.myFunction.apply(this, arguments);
};
// 新しいオブジェクトメソッドを作成し、参照を代入します
this[name] = f;
// 参照を関数に返します
return f;
};
// パラメータ付きの未定義のメソッド名を使用して __resolve をテストします
myObject.someMethod("hello");
// 出力 : Method someMethod was called with arguments: hello
myObject.someOtherMethod("hello","world");
// 出力 : Method someOtherMethod was called with arguments: hello,world
このページに新しいコメントが追加された場合に、電子メールでの通知を希望する。 | コメントレポート