トップへ戻るニュースフォーラムFLASH-ML 過去ログBak@Flaダウンロードよくある質問と答
ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   コーダーズルーム【スクリプト系】
     自作クラスの中のXMLオブジェクト
投稿するにはまず登録を

フラット表示 前のトピック | 次のトピック
投稿者 スレッド
Fumio
Åê¹ÆNo.13635
投稿日時: 2004-12-25 12:40
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
Re: 自作クラスの中のXMLオブジェクト
まずは、動作して何よりです。

以下のご質問にお答えするには、XMLインスタンスxmlObjにコールバック関数として設定するメソッドxmlObjToString()の中の、以下のステートメントにご注目いだくとよいでしょう。
// contents = xmlObj.toString();
this["owner"].contents = this.toString();
引用:
two_lineさんは書きました:
(1)xmlObj["owner"] = this;
(2)this["owner"].contents = this.toString();
という記述についてです。

まず、ActionScript 2.0クラス定義内では、参照先を省略した場合、this参照が自動的に補われます[*1]。ここで注意しなければならないのは、コールバック関数のように、オブジェクトインスタンスに対して設定された関数ブロック({})内のthis参照です。

上記ステートメントからわかることは、コールバック関数内のthisは、その「設定先」であるxmlObjを参照するということです。つまり、thisはクラスXMLObjのインスタンスを参照しません。

ところが、コールバック関数内でもうひとつ参照したいcontentsは、XMLObjクラスのプロパティです。xmlObjもXMLObjクラスのプロパティですから、感覚的にいえば自分の親(タイムラインなら_parent)の参照を得る必要があります。しかし、タイムラインと異なり、プロパティからその持ち主(親)を参照する手段がありません。

そこで、xmlObjプロパティの持ち主であるXMLObjクラスのインスタンス(this)を、xmlObjのプロパティとして設定することが考えられます。これが、xmlObj.ownerです。(1)のステートメントは、この設定を行っています。
引用:
(1)の記述は何故必要なのでしょうか。
XMLObjオブジェクト自身をXMLオブジェクトに参照させなければならない理由を教えて下さい。

コールバック関数内のthisは、関数の設定先であるxmlObjプロパティを参照しますので、this.toString()はxmlObj.toString()と同じ意味になります。ただし、コールバック関数内でxmlObj.toString()と記述すると、thisが補われて、this.xmlObj.toString()と解釈されます。thisはxmlObjプロパティを指す訳ですから、その中にさらにxmlObjというプロパティを探しても存在しません(undefinedと認識されます)。
引用:
(2)の記述についてです。これもまた、今自分なりの答が出ました。
「thisはXMLObjインスタンス自身なのに、this.toString()が機能するのは変だなぁ」と思ってましたが、

実は、上記ステートメントには、もうひとつポイントがあります。xmlObj.ownerとせずに、xmlObj["owner"]と記述した点です。

xmlObjプロパティは、ActionScript 2.0シンタックスにより、XMLクラスで型づけされています。そのため、xmlObj.ownerと記述すると、XMLクラスにそのようなプロパティが存在しないので、コンパイルエラーになってしまいます。

厳密な「作法」に従うなら、xmlObjのクラスをXMLのサブクラスとして定義することになるところです。しかし、今回は少し面倒なので、裏技を使用しています。配列アクセス演算子([])を使ってプロパティにアクセスすれば、型チェックが回避できるのです。

ただし、この裏技で設定したプロパティにアクセスするには、つねに配列アクセス演算子を使用する必要があります((2)のステートメントは、そのため配列アクセス演算子を使用しています)。また、この手法の多用は、型指定を無意味にするので、もちろんお勧めしません。

なお、Delegateクラスを用いれば、コールバック関数のthis参照先を変更できるので、この裏技を使用する必要もなく「スマート」かなと考えた次第です。

最後に、機種依存文字は使用を避けましょう。
_____
[*1] この点は、タイムラインに記述したスクリプトとは異なります


----------------
 

フラット表示 前のトピック | 次のトピック

題名 投稿者 日時
   自作クラスの中のXMLオブジェクト two_line 2004-12-24 23:01
     Re: 自作クラスの中のXMLオブジェクト Fumio 2004-12-25 0:11
     Re: 自作クラスの中のXMLオブジェクト Fumio 2004-12-25 0:25
       Re: 自作クラスの中のXMLオブジェクト two_line 2004-12-25 11:26
       » Re: 自作クラスの中のXMLオブジェクト Fumio 2004-12-25 12:40
           Re: 自作クラスの中のXMLオブジェクト two_line 2004-12-29 11:21

投稿するにはまず登録を
 
Copyright (C) 2003 FLASH-japan. All rights reserved.
Powered by Xoops