为什么Javascript对象引用未更新?

时间:2015-01-13 23:06:29

标签: javascript reference this

我正在创建一堆对象,我想在其他对象中使用某些对象,所以我将它们传递给所以我可以稍后更新它们。我期望保持对每个对象的引用,但是如果我在创建对象之前传递它,即使在创建它之后它也保持未定义。这是代码:

this.screen = new BatchScreen(screenList);
this.fieldData = new FieldData(this.screen, this.nutrientData);
this.nutrientData = new NutrientData(this.screen, this.fieldData);

function FieldData(screen, nutrientData)
{
    this.nutrientData = nutrientData;
}

this.fieldData.nutrientData是“undefined”,我不明白,因为我认为这个.fieldData包含对this.nutrientData的引用,我在this.fieldData中分配后创建它。

3 个答案:

答案 0 :(得分:3)

简短:您没有传递参考文献。

Long:JS中的评估策略称为Call by sharing。它也被解释为“由值传递的引用”。

在细节中的含义是 - 在你的

this.fieldData = new FieldData(this.screen, this.nutrientData);

语句this.screen包含引用,因此它按值传递。 this.nutrientData没有任何内容 - 因此undefined已通过。

然后当你运行

this.nutrientData = new NutrientData(this.screen, this.fieldData);

语句this.nutrientData被定义为对新对象的引用。但是为时已晚 - 我们已经通过undefined构造函数中的FieldData

所以理解它的最好方法是始终认为数据总是按值传递,但有时这些值会保留引用。

让您的代码按预期工作self.nutrientData,其他代码必须是指针,JS不支持任何方式。

解决方案

如果你有2个依赖于对象的对象,那么你不能在它们自己的构造函数中同时拥有它们。其中一个只需暴露额外的setter并通过它接受依赖。

答案 1 :(得分:1)

不是答案,而是可能的解决方案。你真的需要一个getter但是支持不够广泛。如果你有相互依赖的属性,你可以为一个实现一个getter(或者两者兼而有之),所以你有:

this.screen = new BatchScreen(screenList);

// Don't bother passing this.nutrientData since you know it's not defined yet,
// pass in the object that you want the nutrientData property of
this.fieldData = new FieldData(this.screen, this);
this.nutrientData = new NutrientData(this.screen, this.fieldData);

// In here, use a function to return the property so its read when called, 
// not when defined
function FieldData(screen, obj) {
    this.getNutrientData = function () {return obj.nutrientData};
}

然后代替:

var foo = someInstance.fieldData.nutrientData;

使用:

var foo = someInstance.fieldData.getNutrientData();

fieldData nutrientData 之间似乎存在循环关系。

答案 2 :(得分:0)

在这种情况下,第二行中的this.nutrientData不作为引用传递,因为不存在对对象的引用(此时没有this.nutrientData,所以你实际上是传递{{ 1}})。

我猜您在使用undefined;

时也遇到了范围问题

试试这个(没有双关语):

this