-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();

variablem1已更改,并且已将更改的内容复制到 variable 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现在将是 的反转版本m1,并且m1不会受到影响。

另一种选择:JSON hack

您还有另一个选项有点 hacky,但不需要修改原始transformMatrix构造函数:使用 JSON hack 复制原始矩阵,然后调用reverse()复制的对象。它看起来像这样:

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

你甚至可以在你的reverse()函数中包含这个 hack,最终看起来像这样:

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