クラス内のスコープについて

ActionScript 2.0 のクラスへコードを移植するとき、場合によっては this キーワードの使い方を変更する必要があります。たとえば、コールバック関数を使用するクラスメソッド (LoadVars クラスの onLoad メソッドなど) では、this キーワードがクラスを指すのか LoadVars オブジェクトを指すのか判断しにくいことがあります。その場合は、次の例のようにして現在のクラスへのポインタを作成します。

class Product {
    private var m_products_xml:XML;
    // コンストラクタ
    // targetXmlStr は XML ファイルへのパスを含む
    function Product(targetXmlStr:String) {
        /* 現在のクラスへのローカル参照を作成する。 
            XML の onLoad イベントハンドラ内を実行している場合でも、 
            XML パケットだけでなく、現在のクラスも参照できる。 */
        var thisObj:Product = this;
        // ローカル変数を作成する。これは XML のロードに使用する。
        var prodXml:XML = new XML();
        prodXml.ignoreWhite = true;
        prodXml.onLoad = function(success:Boolean) {
            if (success) {
                /* XML を適切にロードおよび解析できた場合は、 
                    クラスの m_products_xml 変数に、解析した 
                    XML ドキュメントを設定し、init 関数を呼び出す。 */
                thisObj.m_products_xml = this;
                thisObj.init();
            } else {
                /* XML ファイルのロードでエラーが発生した。 */
                trace("error loading XML");
            }
        };
        // XML ドキュメントのロードを開始する。
        prodXml.load(targetXmlStr);
    }
    public function init():Void {
        // XML パケットを表示する。
        trace(this.m_products_xml);
    }
}

this キーワードは、onLoad ハンドラ内の private メンバー変数を参照することになるので、Product クラスではなく実際には prodXml インスタンスを表します。このため、onLoad ハンドラからクラスを直接参照するには、このようにローカルクラスファイルへのポインタを作成する必要があります。

クラスの詳細については、クラスとスコープについてを参照してください。スコープの詳細については、スコープの扱いを参照してください。


 

このページに新しいコメントが追加された場合に、電子メールでの通知を希望する。 | コメントレポート

現在のページ: http://livedocs.adobe.com/flash/9.0_jp/main/00001112.html