2

インスタンス化されたときにオブジェクトを受け取ることができる値オブジェクトを使用しているので、次のように、新しいVOが作成されたときにデフォルト値を直接更新できます。

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メソッドは、コンストラクターに渡されたオブジェクト内の既存のプロパティのみを取得するために、try / catchブロックを使用します(または、少なくともそれが意図されています)。

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

ここで、このシナリオを考えてみましょう。新しい値オブジェクトを作成する必要がありますが、3つのプロパティのうち1つだけが定義されています。

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

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

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

どうもありがとうございます。

4

4 に答える 4

3

他のものよりも少し簡潔な解決策:

this.globalPosition = obj.globalPosition || DEFAULT_GLOBAL_POSITION;

Pythonのように、|| 演算子は、そのオペランドが0、null、false、NaN、 ""、またはundefined以外の値に評価された場合、最初のオペランドを返します。それ以外の場合は、2番目のオペランドをそのまま返します。

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

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

于 2012-05-03T19:52:36.553 に答える
2

Flexオブジェクトには、hasOwnProperty()役立つと思われるメソッドがあります。これを使用して、動的オブジェクトにパラメーターが定義されているかどうかを確認し、nullを取得する代わりに、存在する場合にのみパラメーターをプルできます。

if (obj.hasOwnProperty("globalPosition"))
    this.globalPosition = obj.globalPosition;
//etc...
于 2012-05-03T14:34:43.643 に答える
2

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

this.globalPosition = obj.globalPosition ? obj.globalPosition : default;

そこdefaultに置きたいものはどこにありますか...this.globalPosition元の状態に戻したい場合でも機能します。

プロパティが存在するかどうかを尋ねることもできます。

if( "globalPosition" in obj)
于 2012-05-03T14:44:04.137 に答える
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];
       }
    }
于 2012-05-03T14:49:27.917 に答える