当返回对象并在其原始函数中修改它们时,如何在 javascript 中处理对对象的引用

问题描述 投票:0回答:2

我正在尝试创建一个返回对象的函数和一个将该对象重置为其初始状态的函数。比如:

const create = () => ({
    a: "something"
});

const setup = () => {
    let obj = create();

    const reset = () => {
        obj = create();
    }

    return {
        obj,
        reset
    }
}

const { reset, obj: myObj } = setup();

myObj.b = 2;
reset();
console.log("expected to be undefined", myObj.b);

但是当我调用该函数并使用重置函数时,它不会重置该对象。

myObj.2
仍然包含
2
。我希望对
myObj
的引用保持不变,因此当我们调用
reset
时,obj 成为一个新对象,并且 myObj 的引用指向该新对象。

经过一番摆弄后,我意识到如果我这样做,我的功能就可以工作:

const setupWithGet = () => {
    let obj = create();

    const getObj = () => obj;

    const reset = () => {
        obj = create();
    }

    return {
        getObj,
        reset
    }
}

const { reset, getObj } = setupWithGet();

getObj().b = 2;
reset();
console.log("expected to be undefined", getObj().b);

为什么我需要在这里使用新功能?

javascript function scope reference
2个回答
0
投票

我希望对

myObj
的引用保持不变

myObj
继续引用它一直引用的同一个对象。
obj = create();
为变量
obj
分配一个新的引用;这不会影响任何其他变量。

如果您实际修改对象而不创建任何新对象或更改引用,您将能够通过对它的所有引用访问修改后的对象:

const resetInPlace = (obj) => {
    obj.a = "something";
};

const create = () => {
    const obj = {};
    resetInPlace(obj);
    return obj;
};

const setup = () => {
    let obj = create();

    const reset = () => {
        resetInPlace(obj);
    };

    return {
        obj,
        reset
    };
};

0
投票

setup()
返回的对象包含对
obj
原始值的引用。当您重新分配
obj
时,它不会更改此引用,它仍然引用原始对象。它不以任何方式链接到变量。

在第二个版本中,

getObj
是一个引用局部变量
obj
的闭包,而不是对象。重新分配变量会更新该范围内的变量,并且该函数返回该新值。

© www.soinside.com 2019 - 2024. All rights reserved.