我的印象是,作为对象一部分的任何东西都是通过引用设置的。在此示例中似乎并非如此
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
我希望dictionary
持有对this.system
开头的null
的引用,但这仅仅是因为它所引用的是null
。但是,可以看出,bar.dictionary.system
实际上仍然为null,即使其引用已更新。
有人可以解释这里发生了什么吗?
答案 0 :(得分:1)
仍在通过引用进行设置。这里的问题是,通过写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
完全引用不同的值。
答案 1 :(得分:0)
您要在调用基本构造函数后分配this.system
。如果执行此操作,则调用this.system = new System();
这里是对编译器所见内容的粗略模仿:
this.system = null;
this.dictionary = {
system: this.system
}
this.system = new System();
查看您实际上不是如何更新this.dictionary
。
想象一下我有以下代码:
var a = 5;
var b = a;
a = 6;
此时,a
是6,b
是5。这是因为我将b
设置为a
的先前值。如果要更新b
,则必须再次将它们等同。
答案 2 :(得分:0)
在您实际要使用系统值之后,您尝试使用该值。就像下面那样,它也行不通
context
您所遇到的问题是,您不能简单地将var x = null;
console.log(x);
x = "Hallo Welt";
的调用与分配交换-这样就可以解决问题。相反,您可以使用在子类中被覆盖的属性或函数并返回实际值。
super()