Javascript结构

时间:2013-01-29 22:53:23

标签: javascript oop

我遇到了解决我的JS代码结构问题的问题。我基本上是在尝试创建一个包含其他对象的复杂对象。

我所追求的基本上是:

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

或类似的东西。我有一些工作,但在对象中,我希望能够引用对象的其他部分。

例如,通过上面的示例,我想将变量object.objA.objB.v1设置为等于object.objA.objA.v1的值

当我尝试这个时,我遇到一个错误,说它无法访问未定义的objA

如何解决这个问题或对其进行重组以使其有效?

3 个答案:

答案 0 :(得分:1)

您的示例会抛出错误,因为它无效。简单地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 :(得分:0)

对象文字不是自我指涉的。您无法引用尚未定义的内容。这就是你收到错误的原因。

您可以做的是在最初定义结构后推迟自引用属性的定义。

所以最初定义你的对象:

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

然后:

obj.innerObj.a = obj.a;

请记住,这不适用于数字等原始类型。这适用于具有引用的对象,如函数和其他对象/数组。

答案 2 :(得分:0)

不幸的是,在Javascript中定义对象文字时,您无法将对象的其他部分引用到自身。所以:

object.objA.objB.v1: object.objA.objA.v1不合法。它尚未引用object,因为它尚未完成定义。

您可以做的是定义对象,然后在其上设置特定值。它们不会自动更新,除非它们也是对象,因此通过引用传递。

一种可能的解决方案是object.objA.objB.v1可以是一个返回object.objA.ovjaA.v1值的函数。