在实例化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”属性,则它将起作用。

09-18 20:48