-1

次の機能を使用しましょう。

function transformMatrix(a, b, c, d, e, f)
{
  this.data = [a, c, e, b, d, f, 0, 0, 1];
}

transformMatrix.prototype.inverse = function()
{
  //..
  this.data = newdata;
  return this.data;
}

var m1 = new transformMatrix(1, 0, 0, 1, 10, 20); // translate (10, 20)

今、私が電話するとき

m1.inverse();

変数m1が変更されます。

しかし、私が電話するとき

var m2 = m1.inverse();

変数m1が変更され、そのような変更が変数にコピーされますm2。素晴らしい!

inverse元の変数を変更せずに、の結果を新しい変数に割り当てる方法はありますか?

私はそれを行うことができます:

var m2 = m1;
m2.inverse();

しかし、事前の割り当てなしに、他の方法があるかどうかを知りたいのですが、

var m2 = {m1}.inverse(); // incorrect syntax

それは変わらないでしょうm1

機能のinverse機能は変更しないでください。

どんな助けでもありがたいです。ありがとうございました...

4

1 に答える 1

1

元のオブジェクトの変更を回避するには、から新しいオブジェクトを作成し、そのオブジェクトで関数m1を呼び出す必要があります。inverse理想的には、transformMatrixコンストラクターは、渡されたマトリックスから新しいマトリックスを作成できるはずです。これを行うコンストラクターは次のようになります。

function transformMatrix(a, b, c, d, e, f) {
    if(!(a instanceof transformMatrix)) { // if a, the first variable passed in, is NOT a matrix
        this.data = [a, c, e, b, d, f, 0, 0, 1];
    } else { // otherwise it is a matrix; we need to create a new matrix from its data
        this.data = [
            a.data[0],
            a.data[1],
            a.data[2],
            a.data[3],
            a.data[4],
            a.data[5],
            0,
            0,
            1,
        ]
    }
}

ここで、既存の行列をに渡すと、渡された行列のデータから新しいtransformMatrix行列が作成されます。新しいマトリックスを変更しても、古いマトリックスには影響しません。新しい構文は次のようになります。

var m2 = new transformMatrix(m1).reverse(); // note the new keyword, because you're creating a new object

m2の逆バージョンになりm1m1影響を受けません。

別のオプション:JSONハック

ややハッキーな別のオプションがありますが、元のコンストラクターを変更する必要はありませんtransformMatrix。JSONハックを使用して元のマトリックスを複製してから、複製されたオブジェクトを呼び出しreverse()ます。次のようになります。

var m2 = JSON.parse(JSON.stringify(m1)).reverse();

このハックをreverse()関数に含めることもできます。これは、次のようになります。

transformMatrix.prototype.inverse = function() {
    var newMatrix = JSON.parse(JSON.stringify(this));
    //..
    newMatrix.data = newdata;
    return newMatrix.data;
}
于 2012-07-15T17:52:21.733 に答える