【问题标题】:Javascript Variable Assignment of Object While Maintaing Reference对象的Javascript变量赋值,而Maintaing参考
【发布时间】:2023-03-31 06:44:01
【问题描述】:

我有两个变量引用同一个对象,因此 objectA === objectB 为真。我希望能够将 {} 分配给 objectB 并让 objectA 保持 {} 但是每当我这样做时,我实际上只是将 objectB 的引用更改为 {} 所在的位置(我认为)所以现在 objectA 和 objectB 引用不同的东西.我有办法做到这一点,objectA = objectB = {},但我不喜欢这样,因为它在我的实现中需要循环引用。这是可能的还是有更好的方法?

【问题讨论】:

  • 为什么要 A 和 B 引用同一个空类?我看不出这样做的任何理由。
  • 因为我有一个具有多个状态的程序,每个状态由不同的类表示。状态有一个状态管理器,它保存与所有状态有关的信息。 objectA 在状态管理器类中,并被传递给状态类并存储在 objectB 中(此时它是未定义的)。我想定义 objectB 并定义 objectA。
  • 没有办法让这种情况自动发生。只要两个变量都引用同一个对象,它们就可以分别添加/更改/删除该对象的属性并且每个都可以看到更改(因为它是同一个对象),但是您不能将一个分配给新对象并拥有另一个“跟随”。
  • 好的,谢谢,这就是我需要的答案。

标签: javascript variables variable-assignment


【解决方案1】:

创建一个复制构造函数,用于将一个对象的值复制到另一个对象,然后 objectA 和 objectB 将不相等,但它们在属性中具有相同的值。

【讨论】:

    【解决方案2】:

    这是你想要达到的目标吗?

    a = { foo:'Bar' }

    b = Object.create(a) 创建一个以对象a 为原型的新对象。

    a == b 是假的

    b.foo"bar"


    a 中设置属性将使其通过原型链也可以在b 中使用。

    a.foo = "qux"

    b.foo 也是"qux"


    反之则不行:

    b.other = 'a'

    a.otherundefined


    注意Object.create是ECMA Script 5的一部分,需要检查你的目标浏览器是否支持它:http://kangax.github.io/es5-compat-table/#Object.create

    【讨论】:

    • 我很欣赏你的回答,但我真的很想这样做,所以 a 和 b 都引用同一个对象,并且都是空对象。原因是我可以更新一个类中的一个对象并让它在另一个类中更新,而无需从第一个类中引用该类。传递未定义的对象可能对我来说很愚蠢,但我很想知道这是否可能。
    【解决方案3】:

    为了避免额外的混乱,您需要一个可以引用另一个变量的变量。这在 JavaScript 中是不可能的——变量和属性只引用 values,并且严格按值传递。这意味着 A 中的引用是 B 中引用的副本,并且为其中一个分配新引用不能直接影响另一个。

    不过,您可以通过让 A 和 B 指向同一个(可能是空的)对象,然后修改该对象的属性来实现类似的效果。由于两个变量都引用同一个对象,所以属性变化会出现在两个地方。它比内置的 C++ 样式的引用变量稍微笨拙一些,但如果双方都知道规则,它就可以工作。

    (最大的不同是,此设置不会让您任意设置未以这种方式共享的变量。但坦率地说,我认为这是一件的事情。)

    【讨论】:

    • 我已经阅读了很多关于通过复制概念传递参考的信息,但我不确定我是否完全理解。如果我有一个像 function FirstContainer(inputHandler){this.inputHandler = inputHandler; 这样的构造函数this.otherContainer = new OtherContainer(inputHandler);} 这是否意味着OtherContainer中的inputHandler是指FirstContainer中的同一个inputHandler,还是它们是独立的inputHandler?这似乎让我感到困惑,因为如果我复制引用不应该意味着它们指向同一个地方吗?
    • @user3015797:所有三个inputHandlers' 值都指向同一个对象,是的。但它们没有任何其他关系。让我试着澄清一下……在所有华丽和神秘的背后,参考只是一个标识特定对象的数字。与 JavaScript 中的任何其他数字一样,每次存储它或将其传递给函数时,都会创建一个副本。每个副本在每个有意义的方面都是平等的。但就像现实世界中的副本一样,每个副本都是独立存在的——如果您销毁自己的号码副本,或者在上面写下一个新号码,那么除了您自己的副本之外,您没有更改任何其他副本.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-17
    • 2016-03-26
    • 2017-07-05
    • 1970-01-01
    • 2016-01-09
    • 1970-01-01
    相关资源
    最近更新 更多