7

在下面的代码中,可以从嵌套对象字面量中访问 x 成员吗?

var outer = {
    x : 0,
    inner: {
        a : x + 1,       // 'x' is undefined.
        b : outer.x + 1, // 'outer' is undefined.
        c : this.x + 1   // This doesn't produce an error, 
    }                    // but outer.inner.c is NaN.
}
4

4 回答 4

9

以你所说的方式 - 不。

您需要两个阶段的构建,这将起作用:

var outer = { x : 0 };
// outer is constructed at this point.
outer.inner = {
        b : outer.x + 1 // 'outer' is defined here.
};
于 2011-03-13T01:18:33.963 回答
4

不在你那里的构造中,不。

主要原因是outer当你在里面时它实际上还不存在inner

如果您将 的属性更改为inner您可以outer在运行时访问的函数,但这将是非常难看的代码。

考虑使用new outer();代替并以这种方式构建一个对象,然后您可以使用thisinside inner,但那是一个完全不同的构造,看起来像

var outer = function() {
    this.x = 0;
    this.inner = {
        a: this.x + 1
    };                    
};

var b = new outer();

console.log(b.inner.a); // 1
于 2011-03-13T00:58:37.267 回答
0

我认为这种结构没有意义。我不认为有什么能阻止你说

var outer2;
outer2.inner = outer.inner;

在那种情况下,您将如何区分这两个父母?

这样做的方法可能是使用更多的构造函数类型函数,并根据需要将参数分配给 outer.x 和 inner.whatever。

于 2011-03-13T01:03:51.757 回答
0

你也可以使用闭包:

var outer = function outer() {

    var x = 0;   

    return {
       inner : {
           a: x + 1
           }
       }                   
};

var b = outer();
console.log('a is ' + b.inner.a);
//a is 1

有关闭包的精彩文章,请查看javascript garden

http://bonsaiden.github.com/JavaScript-Garden/#closures

于 2011-03-13T01:35:03.837 回答