在JavaScriptHOWTO中,将未实例化的对象传递给不同类的构造函数调用,后者稍后在时间轴中实例化

In JavaScript HOWTO pass uninstantiated object to constructor call of different class, which is instantiated later in the timeline?

本文关键字:实例化 函数调用 时间 JavaScriptHOWTO 对象 同类      更新时间:2023-09-26

在实例化ClassA的对象VarAarB,该变量充当ClassBarA被实例化之后;稍后在管道中的某个地方,我将新实例化的ClassB对象分配给VarB

ClassA中,我保存对VarB&然后用这个来做任何工作。

我面临的问题是,当我试图在VarA上使用任何依赖于VarB的方法时,我会收到错误,说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的Class Extend Util进行简单JavaScript继承。作为我所有班级的基类。

如果你有这样的东西:

var VarB = null, VarA = new ClassA(VarB);

然后,当你准备好了,你就这样做:

VarB = new ClassB();

那么"VarA"对象所持有的是您传入的"null"值,并且您已经将"VarB"的值更改为其他值。没有办法做到你所描述的,至少不完全是这样。JavaScript严格意义上是按值传递,这意味着当您进行函数调用时,您将参数表达式的传递给函数。在"ClassA"构造函数中,"null"恰好来自调用范围中名为"VarB"的变量这一事实被完全隐藏;它只是一个"null"。

现在,可以做的是:

var VarB = { actualB: null }, VarA = new ClassA(VarB);

然后:

VarB.actualB = new ClassB();

在这种情况下,您将而不是更改"VarB"的值;您将更改"VarB"引用的对象的属性值。如果编写"ClassA"代码是为了隐藏该参数并引用其"actualB"属性,那么它就可以工作了。