对类属性的引用为null

时间:2018-07-26 15:05:49

标签: javascript

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

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,即使其引用已更新。

有人可以解释这里发生了什么吗?

3 个答案:

答案 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.systemthis.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()