Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/409.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript结构_Javascript_Oop - Fatal编程技术网

Javascript结构

Javascript结构,javascript,oop,Javascript,Oop,我的JS代码的结构有问题。我基本上是在尝试创建一个包含其他对象的复杂对象 我所追求的基本上是: object { f1: (), f2: (), objA: { objA: { v1: "" } }, objB: { objA: { v1: "", v2: "", f1: () } } }

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

我所追求的基本上是:

object {
    f1: (),
    f2: (),
    objA: {
        objA: {
            v1: ""
        }
    },
    objB: {
        objA: {
            v1: "",
            v2: "",
            f1: ()
        }
    }
}
或者类似的东西。我有一些工作,但在对象中,我希望能够引用对象的其他部分

例如,在上面的例子中,我想将变量
object.objA.objB.v1
设置为等于
object.objA.objA.v1

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


我怎样才能绕过这个问题,或者重新构造它使其工作?

对象文字不是自引用的。您不能引用尚未定义的内容。这就是为什么会出现错误

您可以做的是在初始定义结构之后延迟自引用属性的定义

因此,首先定义对象:

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


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

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

object.objA.objB.v1:object.objA.objA.v1
不合法。它还没有引用
对象
,因为它的定义尚未完成

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


一种可能的解决方案是,
object.objA.objB.v1
可以是一个返回
object.objA.ovjaA.v1
值的函数。您的示例会抛出一个错误,因为它无效。简单地说,
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); 

在初始化对象之前,您无法访问对象的其他属性,直到最终}。到那时为止,对象确实是未定义的。我在这里为一个类似的问题写了一个答案:对于object literal来说这是正常的,您不能访问尚未定义的对象。是的,这很有意义。有什么好办法吗?我不想使用函数返回值,因为我希望数据在以后被重写。我只希望引用变量的代码在被调用时这样做?在这种情况下,您可以将对象创建为函数,这样您就有了一个构造函数。然后在该构造函数中,您可以设置您喜欢的所有变量,因为对象已经初始化。在您的代码中没有
object.objA.objB.v1
,您的意思可能是
object.objB.objA.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);