如何从嵌套对象文字访问外部成员?

时间:2011-03-13 00:56:48

标签: javascript scope nested object-literal

在下面的代码中,是否可以从嵌套对象文字中访问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 个答案:

答案 0 :(得分:9)

你说的方式 - 没有。

你需要两个阶段的构建,这将有效:

var outer = { x : 0 };
// outer is constructed at this point.
outer.inner = {
        b : outer.x + 1 // 'outer' is defined here.
};

答案 1 :(得分:4)

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

当您在outer内时,inner实际上并不存在的主要原因。

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

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

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

var b = new outer();

console.log(b.inner.a); // 1

答案 2 :(得分:0)

我不认为那种结构是有意义的。我认为没有什么可以阻止你说

var outer2;
outer2.inner = outer.inner;

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

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

答案 3 :(得分: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花园

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