语法 - 变量赋值

时间:2012-07-15 17:43:41

标签: javascript

让我们拥有以下功能:

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功能的功能不应更改。

任何帮助将不胜感激。谢谢......

1 个答案:

答案 0 :(得分: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,它将根据传入的矩阵数据创建 new 矩阵。修改新矩阵不会影响旧矩阵。新语法看起来像这样:

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;
}