В JavaScript HOWTO передать необработанный объект в вызов конструктора другого класса, который создается позже на временной шкале? - PullRequest
2 голосов
/ 26 июня 2011

Во время создания объекта VarA из ClassA Я передаю переменную VarB , которая действует как заполнитель для объекта ClassB, После создания экземпляра VarA ; где-то позже в конвейере я присваиваю новый экземпляр класса ClassB TO 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

    }

});

Не уверен, имеет ли это значение, но я использую Класс Extend Util Джона Резига для простого наследования JavaScript. в качестве базового класса всех моих классов.

1 Ответ

2 голосов
/ 26 июня 2011

Если у вас есть что-то вроде этого:

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

, а потом, когда вы будете готовы, вы сделаете это:

VarB = new ClassB();

то, что удерживает объект "VarA", это значение "null", которое вы передали, и вы изменили значение "VarB" на что-то другое. Нет способа сделать то, что вы описываете, по крайней мере, не совсем так. JavaScript строго передается по значению , что означает, что при выполнении вызова функции вы передаете значение выражения аргумента в функцию. Внутри конструктора «ClassA» тот факт, что «null» произошел от переменной в вызывающей области, называемой «VarB», полностью скрыт; это просто «ноль».

Теперь, что вы можете сделать, это:

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

, а затем и позже:

VarB.actualB = new ClassB();

В этом случае вы бы не изменили бы значение "VarB"; Вы бы изменили значение свойства объекта, на который ссылается «VarB». Если бы код «ClassA» был написан для хранения этого параметра и обращения к его свойству «actualB», он бы работал.

...