__resolve (Object.__resolve プロパティ)

public __resolve : Object

ActionScript コードが未定義のメソッドまたはプロパティを参照する場合に自動的に呼び出されるユーザー定義関数への参照です。ActionScript コードがオブジェクトの未定義のプロパティまたはメソッドを参照する場合、Flash Player はオブジェクトの __resolve プロパティが定義されているかどうかを判断します。__resolve が定義されていると、参照先の関数が実行され、未定義のプロパティまたはメソッドの名前が渡されます。これにより、プロパティまたはメソッドが実際に定義された場合と同じように、未定義のプロパティの値および未定義のメソッドのステートメントをプログラムによって提供できます。このプロパティは、クライアント/サーバー間で非常に透過的なやり取りが行われるようにする場合に有用であり、サーバーサイドメソッドを呼び出す方法として推奨されています。

使用できるバージョン : ActionScript 1.0、Flash Lite 2.0

次の例は最初の例から段階的に構築されており、__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 を出力する

関連項目

arguments, Array