あなたのコードにはいくつかのことがあります。まず、言語に適した識別子に名前を付ける習慣を身に付ける必要があります。大文字で始まり、その後、単語の残りの論理部分に小さな文字を使用する識別子 (PascalCase とも呼ばれるシステム) は、クラスに名前を付けるためにのみ使用されます。残りの識別子は camelCase を使用する必要があります (PascalCase に似ていますが、最初の文字は大文字ではありません)**。これにより、コードを理解するための労力が大幅に削減されます。ベテランの AS3 プログラマーは、コードを次のように解釈します。
// Static constant (!) ID of the class User is assigned (?) a value of "2314084"
User.ID = "2314084";
// invoke a method pushView of a local variable navigator with arguments
// of which first is the class TaxiNowOrLater, the second is the class User
navigator.pushView(TaxiNowOrLaterView, User);
おそらく、あなたはそれを意味していませんでした。
new String();
AS3 のコンテキストではまったく意味がありません。文字列は決して参照ではなく、不変であり、大多数のプログラマーが合意したリテラル構文を持っています。上記のコードは と同じです""
。同様に、 とnew String(anotherString)
まったく同じ効果がありanotherString
ます。
あなたの質問: event.target
多くの異なるものである可能性があり、その中には「データ」と呼ばれるプロパティがあるものとないものがあります。この問題への一般的なアプローチは、値をキャストするevent.currentTarget
かevent.target
、イベントをディスパッチすると予想される型にキャストする必要があるということです。Button
クラスのインスタンスからのイベントを期待しているとします。
private function clickHandler(event:MouseEvent):void {
if (Button(event.currentTarget).enabled) // do things
}
同じイベントがボタンではないオブジェクトによってディスパッチされた場合、これはエラーから保護しませんが、エラーレポートをより意識的にします。これは、どのクラスが他のどのクラスにキャストしようとしていたかを示すためです、失敗したとき。
プログラム ロジックで、ハンドラーが処理すべきではないイベントを認識する必要がある場合 (理由は?)、次のように記述できます。
private function clickHandler(event:MouseEvent):void {
var button:Button = event.currentTarget as Button;
if (button && button.enabled) // do things
}
event.target
vs event.currentTarget
- が必要になることはほとんどありませんがevent.target
、ほとんどの場合は が必要currentTarget
です。それが間違っているとは言いませんが、問題があるようです。target
イベントの最初の原因となったオブジェクトです。イベントはバブリングする場合があります。つまり、イベントは表示リスト階層を上下に、最初は親から子へ、次に逆方向に移動する可能性があります。以下の例では、ボタンにラベルがあり、イベントが生成された後にクリックされたとします。この場合、ボタンにリスナーを追加したとしても、ボタンでevent.target
はなくボタン ラベルになります。currentTarget
逆に、イベントをハンドラーにディスパッチした即時オブジェクトです。
さらにいくつかのこと:ObjectProxy
はばかげたクラスです。おそらく、どのイベントでも使用しないでください。それは何の役にも立ちませんし、おそらくバグがありますが、これまでそのバグを発見しようとする人はほとんどいませんでした。簡単に言えば、それが行うことは次のとおりです。オブジェクトを作成し、動的な作成、そのプロパティの割り当て、および削除を「監視」し、これらのイベントが発生したときにイベントをディスパッチします。この動作は、多くのエラーや暗黙のバグを引き起こしやすい傾向があります。たとえばfoo.bar = "baz"; foo.bar = "baz";
、同じプロパティの再割り当てですか? foo.bar.baz = "fizzbuzz";
の修正ですかfoo.bar
?プロパティ名が文字列でない場合はどうなりますか? 等々。
使用しない理由: データを処理するためのより良い方法が常にあります。より透過的で、デバッグしやすく、より効率的です。このクラスは、実際に機能したことのないプロトタイプです。上記の動作に加えて、それを記述するために使用されたコード行の点で巨大です。内部で発生するエラーをデバッグするには、多くの時間と忍耐が必要ですが、それだけの価値はありません。
ユーザーを表すオブジェクトが必要な場合は、ユーザーが持つと予想されるプロパティを使用してクラスを定義し、そのクラスを使用するだけです。これにより、コードのデバッグと理解がはるかに簡単になります。
[Bindable]
メタデータは悪です。あまりにも頻繁に使用されるため、避けるべきだとは言えませんが、そうします。できるだけ避けるべきです。このメタの使用が正当化される例にはまだ遭遇していません。プロトタイプと同じような精神でObjectProxy
、パフォーマンスやコーナーケースをあまり考慮しない怠惰なプログラマー向けに設計されたものです。これも、多くの暗黙のバグの原因であり、通常、このメタの周りで生成されたコードがエラーを「飲み込む」ため、発見するのが困難です。このメタに代わるものはaddEventListener(...)
、カスタム イベントを含むプレーン コードです。
残念ながら、多くのチュートリアルでは、この種のコードを使用して、言語とフレームワークをすぐに使い始めることができます...
** この規則にはいくつかの例外があります。定数はすべて大文字で、名前空間名は単語の論理部分を区切るためにアンダースコアを使用しますが、大文字は使用しないでください。