首页 > 解决方案 > 在 Javascript 中通过引用传递对象和属性

问题描述

我已经看到很多关于在 Javascript 中通过引用传递对象的问题,但不是通过引用传递对象和属性的问题。可能吗?

现在我只能通过类似这样的某种逻辑找到一种方法,这非常不方便:

let multipliers = {
    none:1,
    sin:2,
    cos:3,
    tan:4,
    atan:5,
}

incMultiplier(shapesMovements[index], "rotation", "x", "sin")

function incMultiplier(shapeMovement, kind, dimension, multiplier){

    var numOfKeys = Object.keys(multipliers).length;
    
    if(kind === "rotation"){
    
        if(dimension === "x"){
        
            if(multiplier === "sin"){
                if(shapeMovement.rotation.x.multiplier !== numOfKeys){
                    shapeMovement.rotation.x.multiplier += 1
                }else{
                    shapeMovement.rotation.x.multiplier = 1
                }
            }
        
        }
    
    }

}

我只想用我投入该函数的任何对象和属性将属性值增加一。

我看过另一篇可以传递参数的帖子,但这看起来是为了组装一个新对象,而不是通过引用。我需要实际编辑对象属性的值。

最初,这是我正在尝试的,它似乎并没有在全球范围内改变对象。仅在函数本地:

incMultiplier(shapesMovements[index].rotation.x.multiplier)

function incMultiplier(multiplier){

    var numOfKeys = Object.keys(multipliers).length;
    if(multiplier !== numOfKeys){
        multiplier = multiplier + 1 
    }else{
        multiplier = 1
    }

    // always results in the same number. 
    // Does not keep increasing every time the function is called.
    console.log(multiplier); 
}

标签: javascriptfunctionobjectpropertiesreference

解决方案


最初,这就是我正在尝试的

您没有在那里传递具有其属性的对象。您正在传递单个属性的值,而要multiplier执行的赋值实际上只是覆盖了函数中的局部变量。您需要传递一个对象并明确分配给它的属性:

function incMultiplier(valueObj) {
    var numOfKeys = Object.keys(multipliers).length;
    if (valueObj.multiplier !== numOfKeys) {
        valueObj.multiplier++;
    } else {
        valueObj.multiplier = 1
    }
}

incMultiplier(shapesMovements[index].rotation.x)
incMultiplier(shapesMovements[index].position.x)
incMultiplier(shapesMovements[index].rotation.y)
incMultiplier(shapesMovements[index].rotation.z)

没有必要传递整个shapesMovements对象以及嵌套在其中的所有内容,传递一个可变对象就足够了。


推荐阅读