让我们拥有以下功能:
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
功能的功能不应更改。
任何帮助将不胜感激。谢谢......
答案 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
不会受到影响。
您有另一个选项有点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;
}