2012-05-03 10 views
2

新しいVOが作成されたときに同じようにそのデフォルト値は、直接更新することができますので、私は、それがインスタンス化されるときにオブジェクトを受け取ることができる値オブジェクトを使用しています:TRY/CATCHがデフォルトのプロパティ値を上書きするのはなぜですか?

public class SeatSettingsVO 
{ 
    public var globalPosition:Point = new Point(0, 0); 
    public var dealerChipOffset:Point = new Point(0, 0); 
    public var chipStackOffset:Point = new Point(0, 0); 

    public function SeatSettingsVO(obj:Object = null) 
    { 
     if (obj) 
      parseSettings(obj); 
    } 
} 

parseSettings方法はを使用していますコンストラクタに渡されたオブジェクト(あるいは、少なくとも、それは意図だろう)で唯一の既存のプロパティを取得するために/キャッチにブロックを試してみてください。

private function parseSettings(obj:Object):void 
    { 
     try 
     { 
      this.globalPosition = obj.globalPosition; 
      this.chipStackOffset = obj.chipStackOffset; 
      this.dealerChipOffset = obj.dealerChipOffset; 
     } 
     catch (error:Error) 
     { 
     } 
    } 

を今、このシナリオを考えてみます。新しい値オブジェクトをする必要があります創造されるが、3つのプロペrties定義:

new SeatSettingsVO({globalPosition:new Point(300, 277)}) 

問題は、objが特定のプロパティが含まれていない場合(例えばchipStackOffset)は、初期プロパティ値(Point(0,0))を維持する代わりに、nullに上書きします。

私の推測では、Objectクラスインスタンス上に存在しないプロパティにアクセスしてもエラーは発生しませんが、nullが返され、デフォルト値が上書きされます。誰もこの行動を説明でき、おそらく解決策を提案できますか?

ありがとうございました。

+0

*私の推測では、Objectクラスインスタンス上に存在しないプロパティにアクセスすると、エラーは発生せず、むしろnullが返されます。*正しいです。プロパティが存在するかどうかを確認する(@ Sam DeHaanが言ったように)方法があります。 – NemoStein

+3

@NemoStein nullを返しませんが、 'undefined'を返します –

+0

@BrianGenisio、+1。あなたは完全に正しいです。 "定義されていません"は "空"ではありません。 'null'と' undefined'ははるかに異なっています。それを指摘してくれてありがとう。 – NemoStein

答えて

2

フレックスオブジェクトには便利な方法があるhasOwnProperty()メソッドがあります。これを使用して、動的オブジェクトにパラメータが定義されているかどうかを確認し、存在する場合はNULLを取得する代わりにプルするだけです。

if (obj.hasOwnProperty("globalPosition")) 
    this.globalPosition = obj.globalPosition; 
//etc... 
+0

はい、同意します。それは値をテストする適切な方法ですが、私は各プロパティをテストせずにこれを行う方法があると確信していました。まあ... :) –

2

この場合、オブジェクトは動的なので、プロパティが存在しない場合は例外が発生しません。しかし、あなたはundefinedを得ます。 undefinedはnullに評価され、あなたがいつも言うことができる:

defaultはあなたが戻って、それが何だったかにそれを設定したい場合でも、 this.globalPositionが働くだろう...あなたがそこに入れたいものは何でもある
this.globalPosition = obj.globalPosition ? obj.globalPosition : default; 

プロパティが存在する場合にも尋ねることができます:

if("globalPosition" in obj) 
0
private function parseSettings(obj:Object):void 
    { 
     try 
     { 
      this.globalPosition = obj.globalPosition; 
      this.chipStackOffset = obj.chipStackOffset;// when error occured here, 
      // this.chipStackOffset still waiting for a value to set and it sets to null. 
      // probably dealerChipOffset doesnt change by default value. 
      this.dealerChipOffset = obj.dealerChipOffset; // this is {0,0} point prob,didnt try it. 
     } 
     catch (error:Error) 
     { 
     } 
    } 

私は以下のように気にいらを使用します。それが役に立てば幸い。

private function parseSettings(obj:Object):void 
    { 
     for(var name in obj){ 
      this[name] = obj[name]; 
     } 
    } 
+0

最初の例では、chipStackOffsetとdealerChipOffsetの両方がnullです。私はすでにそれをチェックしている。 2番目の例は私が目指していたものですが、異なるプロパティを持つオブジェクトを渡すと、エラーがスローされます。 try/catchブロックはそれを防ぐべきだったはずです。しかし、あなたのアイデアは素晴らしいです!ありがとう。 –

+0

上記のコメントを修正するには、正しいです。通常は、2番目のステートメントがエラーをスローすると、3番目のステートメントは実行されません。しかし、この場合は、オブジェクトを使用しているので、それは起こりません。 –

3

A他のものよりわずかにより簡潔溶液:Pythonで

this.globalPosition = obj.globalPosition || DEFAULT_GLOBAL_POSITION; 

同様に、||演算子が0、null、false、NaN、 ""、またはundefined以外の値に評価される場合、最初のオペランドを返します。そうでない場合は、そのままそれが第二オペランドを返します。

trace(new Point(3, 3) || "hi"); //(x=3, y=3) 
trace(false || "hi"); //hi 
trace("hi" || "bye"); //hi 
trace(0 || null); //null 
trace(NaN || 0); //0 
trace("" || undefined); //undefined 
trace(undefined || new Point(0.4, 0)); //(x=0.4, y=0) 
trace(null || false); //false 

その結果、あなたは、値が定義されているかどうかをチェックしそうであればその値を使用し、ない場合は、デフォルト値を使用するためにそれを使用することができます。私は正直なところ、あなたのコードを多かれ少なかれ読みやすくするかどうかは分かりませんが、それはオプションです。

+0

+1また、文や三項演算子よりもはるかに短くて読みやすいので、この表記が好きです。 – weltraumpirat

+0

ニース!答えてくれてありがとう。 –

関連する問題