2012-02-01 19 views
2

addProperty()を使用して、ゲッターでクラスを動的に設定しています。ここでは、まさにそれを行う私のコードの抜粋です:AS2:名前のあるプロパティがありません

for (var i in options) 
{ 
    this.addProperty(i, getOption, null); 
    this._optionCount++; 
} 

//a little while later.... 

public function getOption() 
{ 
    return "hellO"; 
} 

これは(チエニル前のコードは、ドロップダウンと呼ばれるクラスの一部である)私は、タイムラインから次を呼び出すときので、正常に動作している:

var options:Object = new Object(); 
options.one = "hello"; 
options.two = "goodday"; 
options.three = "yo"; 
options.four= "MEGA AMAZING"; 
options.five= "yo yo yo"; 
var drop1:DropDown = new DropDown(this.drop1, "red", options) 

そしてによってvar drop1のプロパティのすべてをトレースしようとすると:私は、次の取得

for (var i in drop1) 
    trace(i+" = "+drop1[i]); 

しかし
_initY = -107 
_mask = _level0.drop1.mask 
_dropdown = _level0.drop1.options 
_optionWidth = 143 
_button = _level0.drop1 
one = hellO 
two = hellO 
three = hellO 
four = hellO 
_optionCount = 5 
five = hellO 
_shadow = 8330268 
_highlight = 9249057 

私は、次をトレースしようとすると:

名「1」が何のプロパティがありません:

trace(drop1.one); 

それは言ってくれコンパイラエラーが発生します。

なぜこのプロパティにアクセスできないのですか?

答えて

0

ちょうど私がAS2を使ってから長い時間でした。

AS2で型を宣言すると、コンパイラはその型についてすべてを知っていると考えます。それはクラス宣言を見て、それを福音として受け取ります。つまり、クラス宣言にないプロパティに割り当てることはできません。

私が思い出した限り、あなたはそのAS2トラップに陥る唯一の人ではありません。 Flashの各バージョンに同梱されている組み込みクラス宣言からメソッドやプロパティが欠けているクラスがいくつかあります。タイプセーフな方法でアクセスできなかったことを意味します。

実際には良い解決策はありませんが、回避策がありますが、実行しようとしているタイプの安全性を取り除くことだけです。

  • タイプを宣言しないでください:var drop1 = new DropDown(this.drop1, "red", options);は、動作するはずです。
  • ダイナミックようにクラスを宣言します。dynamic public class DropDown() ...(これも、型の安全性を取り除くもちろん)
  • 使用アレイアクセス:trace(drop1["one"]);(それはクラスの残りのための型の安全性の利点を維持しているため、以前のものに好ま)。
  • addPropertyを気にしないでください。代わりにファンクションスタイルセッター/ゲッターを使用してください(getOption()/setOption())。

最後の方が好きな理由:addPropertyが実際にうまく機能していれば「うまく見える」わけではないかもしれませんが、コード内で何が起きているのかを簡単に解読できます。 addPropertyとは異なり、インジケーションのレベルが追加され、追加されたプロパティをコードを読み取っている誰かに魔法のように見せかける可能性が高くなります。

+0

私は「ダイナミック」タイプ、歓声を知らなかった:O –

0

AsSetPropertyFlagsと、プロパティを列挙可能にする方法を調べたいとします。しかし、私はあなたがやっているやり方ではなく、代わりにsetOption(オプション)とgetOption(オプション)関数を使うでしょう - コードが少なくて、間接的でなく、あまり不明瞭ではありません。最悪の場合、私はクラス内で__resolve()を実装します。

AS2をクラスに書く場合は、より良いコンパイラ(MTASCまたはFLASC)を見て、次に使用しているように見えます。

+0

__resolve()はコンパイラを助けませんか? (しかし、私はAS2と見なして以来、長いことがあります)。しかしaddProperty()を落とすことに同意します。 – JimmiTh

+0

完全に同意しますが、エラーメッセージ "xxxという名前のプロパティはありません"とまったく同じです。コンパイラによる不明なプロパティへのアクセスの防止(実行時エラーとは対照的) – JimmiTh

関連する問題