【问题标题】:Override value of object reference覆盖对象引用的值
【发布时间】:2018-06-21 18:02:08
【问题描述】:

当您将对象引用作为参数传递给函数时,分配给该引用只会更改引用的内容,但不会更改值,如下所示:

class meh {
    constructor() {
        this.obj = { member: 7 };
    }

    doSomething() {
        doFn(this.obj);
    }
    doFn(objRef) {
        objRef = { newMember: 4 } // Doesn't overwrite obj; merely assigns a new object to objRef.
    }
}

但是有没有办法覆盖或以其他方式为对象引用指向的实际位置分配一个值?意思是,有没有办法将一个新对象分配给objRef(在doFn)并反映在obj中?

【问题讨论】:

  • 不,因为这会使代码不可靠。任何地方的变量都可能发生变化,甚至在可能导致神秘错误的范围之外。所以不,这是不可能的,有充分的理由。
  • 变量指向值,而不是相反。当你说this.obj = foo 时,this.obj 指向foo 的位置。当您随后说 this.obj = bar 时,您的 obj 现在只是指向 bar 的位置。赋值不会改变值的任何内容。 (这就是为什么const 以它的方式工作的原因,顺便说一句)。这也是为什么变量在 JS 中没有类型 - 只有值有 - 变量只是指向一个值,而重新分配只是将指针重新分配到另一个值的位置。

标签: javascript reference ecma


【解决方案1】:

这取决于你的情况。

以 react 为例,您可以将变量存储在一个状态中,其中有一个用于更新的预内置函数,称为 this.setState,但是如果您使用的是纯 JavaScript,您可以创建自己的全局存储变量,然后直接更新这些变量。我不建议这样做,但作为示例,您可以将变量存储在 window['somevariable'] 下以将它们存储在 window 对象中,以后可以访问这些变量。

为了让它更加花哨,您可以创建预先构建的函数来为您完成您可以调用的工作,将变量的参数和要更新的值作为对象传递,然后您模仿React 的状态特征。

Redux 再举一个例子,它是否通过一个集中的“存储”巧妙地解决了问题,您可以在其中发送数据并从中检索数据,检查一下。

我希望它能回答你的问题。

【讨论】:

  • 这不能回答问题。重新分配变量永远不会改变原始值。期间。
  • 对不起,我并不是说他的要求是可能的。我正在给他一个解决方案如何做他想要完成的事情。
  • 很公平。我可能会在您的回答中补充说,通过重新分配进行修改是不可能的,但是使用 Object.assign() 或其他类似概念,您可以修改/更新原始对象,同时保持引用相同。不过,React 是一个真的 不好的例子,因为状态的不变性是一个核心概念,而这正是 OP 不想要的。 OP 希望用新的/更新的属性改变原始对象,但保持对象引用相同。
  • 随时编辑您的答案,我很乐意投票。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-11
  • 1970-01-01
  • 2013-08-28
  • 2016-02-20
  • 2019-02-20
  • 2014-09-21
  • 1970-01-01
相关资源
最近更新 更多