在实例化ClassA的对象VarA的过程中,我传入了变量VarB,该变量充当ClassB的对象的占位符。在实例化VarA之后;我将在管道中的某处稍后将ClassB的新实例化对象分配给VarB。
在ClassA中,我保存对VarB的引用,然后使用它来执行任何工作。
我面临的问题是,当我尝试在依赖VarB的VarA上使用任何方法时,出现错误,指出VarB是未定义的。这使我感到困惑,因为在使用这些方法之前,请确保已正确实例化VarB。而且由于我保存了对VarB的引用,因此它应该指向corect对象,对吗?
更新-根据要求提供代码示例。
var varA, varB;
// Code
varA = new ClassA({
varB: varB
});
// Code
varB = new ClassB({
attributeB: "SOME_VALUE",
});
// Class Definition for ClassA which uses varB
var ClassA = Class.extend({
varB: {},
init: function(settings) {
this.varB = settings.varB;
},
dummyMethod: function() {
// Do Something with varB.attributeB
}
});
不知道这是否重要,但是我将John Resig's Class Extend Util for Simple JavaScript Inheritance.用作所有类的基类。
最佳答案
如果您有这样的事情:
var VarB = null, VarA = new ClassA(VarB);
然后,当您准备就绪时,请执行以下操作:
VarB = new ClassB();
那么该“ VarA”对象保留的是您传入的“空”值,并且您已将“ VarB”的值更改为其他值。没有办法做您描述的事情,至少不能完全做到。 JavaScript严格按值传递,这意味着在进行函数调用时,您会将参数表达式的值传递给函数。在“ ClassA”构造函数中,“ null”恰好来自调用范围中称为“ VarB”的变量的事实被完全隐藏;这只是一个“空”。
现在,您可以执行以下操作:
var VarB = { actualB: null }, VarA = new ClassA(VarB);
然后再:
VarB.actualB = new ClassB();
在这种情况下,您将不会更改“ VarB”的值。您将更改“ VarB”引用的对象的属性值。如果编写了“ ClassA”代码以隐藏该参数并引用其“ actualB”属性,则它将起作用。