0

「_position」が Sprite の Point オブジェクト メンバーであり、Number メンバー x と y、および独自の get/set 定義を使用する場合、これが機能するように、より高いレベルの「set」を適用するにはどうすればよいですか (編集: Point の 'set' 関数ではなく、Sprite の 'set' 関数):

// EDIT: example calling line, embedding context should be unimportant
// 'this' is a Sprite instance
this.position.set(x, y);


Object.defineProperties(Sprite.prototype, {

// a bunch of other properties excised here

    position: {
        get: function() {
            return this._position;
        },

        set: function(_pos) {
            this._position.x = this.transform.x = _pos.x;
            this._position.y = this.transform.y = _pos.y;
            this.transform.updateTransform();
        }
    }
};

現在何が起こっているかというと、「this.position」が「position.get」プロパティに渡され、次に「this.position.set」が Point set 関数に渡されます。独自の get/set を使用してオブジェクトを「設定」しようとすると、最低レベルに落ちるようです。

この動作を変更する方法が必要なように感じますが、私のグーグル検索とスタックオーバーフロー検索では答えが見つかりません。ここでやりたいことを表す適切な用語がある可能性がありますが、それがなければ、質問というフレーズを正しく理解するのに苦労しています。

例: これは近いですが、私の状況ではうまくいきません

編集: Point のソース ファイル、または this.position.set(x,y); の関数は制御しません。保持されています。ただし、実際にポイント セット関数を使用したい他のオブジェクトを壊さないことを証明できれば、呼び出し構文の変更の許可を得ることができるかもしれません。

4

2 に答える 2

1

Bergi が回答を投稿しなかったので、これは良い質問なので投稿します。

周囲のコードをまったく制御しない場合、残念ながら、それを行う方法は醜いものしかありません。

A)Bergiが提案したように、あなたが望むことを何でもするプロキシオブジェクトを返します。

欠点は、周囲のコードが、送信したオブジェクトが受信したオブジェクトと一致することを期待している可能性があることです。開発者が値ではなくオブジェクト参照を比較し、そのような比較が失敗することは考えられません。しかし、それはあなたのコードですでに発生しているので、すでにそれを使用していて、何も壊れていない場合は、問題ありません。

また、この方法で行う場合はMyPoint.prototype = new Point()、新しいメソッドが Point に追加された場合にクラスでも使用できるように、何かを作成する必要があります。

this._position.setB)コンストラクター内のオブジェクトごとに、または設定した場所で手動でセッターとゲッターをオーバーライドおよび/またはセッターします。これは遅くて非常に汚く、非常に悪いアイデアなので、スニペットを書いてから削除しました:)

ここでは、実際に何をすべきかについていくつかのオプションを示します。

A) のユーザーがまたはSpriteを使用することに同意します。次に、getter でのd コピーを返して、不適切に使用されていないことを確認する必要があります。sprite.position = newPossprite.setPosition(newPos)Object.freeze()_position

PointB) の作成者が変更されたときに何らかのイベントを発行することに同意し、それをリッスンすることができますSprite

于 2015-11-05T03:10:27.697 に答える