在Javascript中传递给构造函数的数组是';在调用内容中未修改

在Javascript中传递给构造函数的数组是';在调用内容中未修改,javascript,Javascript,我在调用上下文中导入了以下模块: function Controls(elem, viewMatrix) { var xD, yD; this.ppdX = 10; this.ppdY = 10; this.state = 0; var dx = 0; var dy = 0; function getXY(evt) { var x = evt.pageX - elem.offsetLeft; var

我在调用上下文中导入了以下模块:

function Controls(elem, viewMatrix) {

    var xD, yD;

    this.ppdX = 10;
    this.ppdY = 10;

    this.state = 0;
    var dx = 0;
    var dy = 0;

    function getXY(evt) {
        var x = evt.pageX - elem.offsetLeft;
        var y = evt.pageY - elem.offsetTop;
        return [x, y];
    }

    function onDown(evt) {
        this.state = 1;
        [xD, yD] = getXY(evt);
    }

    function onUp(evt) {
        this.state = 0;
        [dx, dy] = [0, 0];
    }

    function onMove(evt) {
        if (!this.state) return;
        var [x, y] = getXY(evt);
        [dx, dy] = [x - xD, y - yD];
    }

    this.updateView = function () {
        viewMatrix = Mtx.mult(viewMatrix, Mtx.rotY(-Mtx.DtoR * dx / this.ppdX));
        viewMatrix = Mtx.mult(viewMatrix, Mtx.rotX(-Mtx.DtoR * dy / this.ppdY));
    }

    elem.addEventListener("mousedown", onDown.bind(this));
    elem.addEventListener("mouseup", onUp.bind(this));
    elem.addEventListener("mousemove", onMove.bind(this));
}

export default Controls;
调用上下文如下所示:

import Controls from './js/controls.module.js';
...

viewMatrix = Mtx.makeIdent(4, 4);
controls = new Controls(renderer.domElement, viewMatrix);
...

function animate() {

    requestAnimationFrame(animate);

    if (controls.state) {
        controls.updateView();
        ...
        console.log(viewMatrix);
    }

...

}
其中viewMatrix是一个4x4数组,定义如下:

viewMatrix = [[...],[...],[...],[...]];
我可以看到,虽然viewMatrix在updateView()调用中发生了更改,但在调用上下文中并没有发生更改。数组应该通过引用传递,在这种情况下不是这样吗

我知道我可以将updateView()中的矩阵返回到调用上下文并覆盖那里的viewMatrix,但我想知道为什么它不更新,也许有另一种方法来编写代码,以便它自己更新

编辑乘法的代码:

    mult(A, B) {
        var C = [];
        var Ar = A.length, Ac = A[0].length;
        var Br = B.length, Bc = B[0].length;
        if (Ac != Br) {
            console.log("mult(): dimentions mismatch");
            return C;
        }
        for (let ar = 0; ar < Ar; ar++) {
            C[ar] = [];
            for (let bc = 0; bc < Bc; bc++) {
                C[ar][bc] = 0;
                for (let ac = 0; ac < Ac; ac++) {
                    C[ar][bc] += A[ar][ac] * B[ac][bc]
                }
            }
        }
        return C;
    },
mult(A,B){
var C=[];
var Ar=A.length,Ac=A[0].长度;
var Br=B.length,Bc=B[0]。length;
如果(Ac!=Br){
log(“mult():维度不匹配”);
返回C;
}
for(设ar=0;ar
我们可能需要了解
mult()
是如何实现的,但是在语句
viewMatrix=Mtx.mult(…)
中,看起来好像刚刚覆盖了
viewMatrix
的值,这意味着原始矩阵对象不会受到语句的影响。(同样,这取决于
mult()
是如何实现的。)我已经添加了代码,如何更改它以使其不破坏对外部viewMatrix的引用?您可以执行类似
const temp=Mtx.mult(…)
,然后将
temp
的元素复制到
viewMatrix
。(这是一个单独的问题,但请记住,这种对矩阵的重复修改可能会导致数值错误累积,随着时间的推移,这可能会变得明显。)只需在
updateView
中使用
This.viewMatrix
,然后执行
console.log(controls.viewMatrix)
。不要试图让控件操纵全局
viewMatrix
,它应该是一个实例属性。@user1481126:显然,您可以做任何您想做的事情,但是可能有一些参数(例如,基于“关注点分离”原则或MVC模式)不将矩阵作为“控件”对象的属性。另一种选择(可能比我之前的建议更好)是将视图矩阵(和任何其他类似数据)作为“控件”对象存储引用的对象的属性。然后,您可以像当前一样覆盖矩阵,同时仍然能够从其他地方访问它,而不受“控件”对象的影响。