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
类型的对象。