Javascript 对类属性的引用为null

Javascript 对类属性的引用为null,javascript,Javascript,我的印象是,作为对象一部分的任何东西都是通过引用设置的。在本例中,情况似乎并非如此 class System {} class Foo { constructor() { this.system = null; this.dictionary = { system: this.system } } } class Bar extends Foo { constructor() { super(); this.system = n

我的印象是,作为对象一部分的任何东西都是通过引用设置的。在本例中,情况似乎并非如此

class System {}

class Foo {
  constructor() {
    this.system = null;
    this.dictionary = {
      system: this.system
    }
  }
}

class Bar extends Foo {
  constructor() {
    super();
    this.system = new System();
  }
}

var bar = new Bar();
console.log(bar.system); // System{}
console.log(bar.dictionary.system); // null
我希望
字典
包含对
这个系统的引用,该系统以
null
开头,但这仅仅是因为它引用的是
null
。然而,正如我们所看到的,
bar.dictionary.system
实际上仍然是空的,即使它的引用被更新了


有人能解释一下这里发生了什么吗?

仍在参照设置中。这里的问题是,通过编写
this.system=new system()
您不是在修改引用值,而是在使
this.system
引用一个不同的值。同时,
this.dictionary.system
仍指向旧值

考虑以下代码:

class Foo {
    constructor() {
        this.system = {};
        this.dictionary = { system: this.system };
    }
}
class Bar {
    constructor() {
        super();
        this.system.bananas = 5;
    }
}

这将正确地将香蕉添加到
this.system
this.dictionary.system
,因为您正在修改被引用的值,而不是使
this.system
完全引用不同的值。

在调用基本构造函数之后,您正在分配
this.system
。如果执行此操作,则在调用
this.system=new system()后不会更新字典

下面是对编译器所看到内容的粗略模拟:

this.system = null;
this.dictionary = {
  system: this.system
}
this.system = new System();
查看您如何不实际更新此词典

假设我有以下代码:

var a = 5;
var b = a;
a = 6;

此时,
a
为6,
b
为5。这是因为我将
b
设置为
a
的上一个值。如果我想更新
b
,我必须再次将它们等同起来

您正在尝试使用system的值,该值是在您实际想要使用它之后分配的。这就像下面的步骤一样,也行不通

var x = null;
console.log(x);
x = "Hallo Welt";
在您的例子中,问题是,您不能简单地将
super()
的调用与赋值交换,这将解决问题。相反,您可以使用属性或函数,这些属性或函数在子类中被重写并返回实际值

class Foo {
  constructor() {
    this.dictionary = {
      system: this.system
    }
  }

  get system() { return null; }
}

class Bar extends Foo {
  constructor() {
    super();
  }

  get system() {
    return this._system ?
      this._system :
      this._system = new System();
  }
}

在调用基本构造函数之后,您正在分配
此.system
。如果这样做,调用'this.System=new System(),就不会更新字典@Cubemaster如果词典保留了
这个.system的引用,为什么词典没有更新?如果对象是通过引用传递的,则应该更新。。它就像一个指针——起初它指向null,但现在它应该指向
System
我不是提供建议的最佳人选,因为我一生中没有写过一个javascript单词。然而,如果它与我所知道的任何其他OO语言相似,那么字典的值仍然是您第一次设置它时的值。我不知道所有花哨的编码术语,但字典似乎没有动态引用系统,只有在您强制它时才会更新to@EKW措辞比我能说得好,但看到我修改后的答案,类似的例子应该更有意义。我明白了。。所以它不像一个指针,它仍然指向同一个地址,而不管地址是什么contents@ICU_是的,没错!它就像一个指针。如果我的回答有帮助,请记住把它标记为正确:)你们刚才说的话正好相反。OP说它不像一个指针,而你说它像一个指针。。“这是哪一个?”女服务员哎呀,我看错了。这就像一个指针,如果你改变了指针的地址,它就不再指向同一个东西了。啊,明白了。有一分钟我感到非常困惑。这是可以理解的,因为只有对象通过引用传递。a和b都是对象,别忘了。它们是
int
类型的对象。