У меня проблема с получением правильной структуры моего кода JS. Я в основном пытаюсь создать сложный объект, который содержит другие объекты.

То, что я ищу, это что-то вроде:

object {
    f1: (),
    f2: (),
    objA: {
        objA: {
            v1: ""
        }
    },
    objB: {
        objA: {
            v1: "",
            v2: "",
            f1: ()
        }
    }
}

Или что-то похожее на это. У меня было что-то вроде работы, но в объекте я хочу иметь возможность ссылаться на другие части объекта.

Так, например, в приведенном выше примере я хотел бы установить переменную object.objA.objB.v1 равной значению из object.objA.objA.v1

Когда я попробовал это, я просто получил сообщение о том, что не может получить доступ к objA неопределенному.

Как я могу обойти это или реструктурировать это, чтобы заставить это работать?

0
PaReeOhNos 30 Янв 2013 в 02:53

3 ответа

Лучший ответ

Объектные литералы не являются самоссылочными. Вы не можете ссылаться на то, что еще не было определено. Вот почему вы получаете ошибку.

Что вы можете сделать, так это отложить определение самоссылочных свойств после того, как структура была изначально определена.

Итак, сначала определите ваш объект:

var obj = {
    a: {
        prop1: 1
    },
    b: 2,
    innerObj: {}
};

Затем:

obj.innerObj.a = obj.a;

Имейте в виду, что это не будет работать для примитивных типов, таких как числа. Это будет работать для объектов, которые имеют ссылки, таких как функции и другие объекты / массивы.

0
Vivin Paliath 29 Янв 2013 в 23:05

К сожалению, в Javascript при определении литералов объекта нельзя ссылаться на другие части объекта. Так:

object.objA.objB.v1: object.objA.objA.v1 не является законным. Он еще не имеет ссылки на object, поскольку он еще не определен.

Что вы могли бы сделать, это определить объект, а затем установить конкретные значения для него. Они не будут обновляться автоматически, если только они не являются объектами и поэтому передаются по ссылке.

Возможное решение состоит в том, что object.objA.objB.v1 может быть функцией, которая возвращает значение object.objA.ovjaA.v1.

0
earl3s 29 Янв 2013 в 23:00

Ваш пример выдает ошибку, потому что это недопустимо. Просто object.objA.objB.v1 не существует. Но если вы хотите использовать свойства существующих объектов, вы можете сделать это просто:

var yourObj =  {
objA: {
    objA: {
        v1: "a"
    }
},
objB: {
    objA: {
        v1: "b",
        v2: "c",
    }
}
}

yourObj.objB.objA.v1 = yourObj.objA.objA.v1;
alert(yourObj.objB.objA.v1); 

jsFiddle

1
DarkAjax 29 Янв 2013 в 23:12