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