【问题标题】:How to access an outer member from a nested object literal?如何从嵌套对象文字访问外部成员?
【发布时间】:2011-03-13 00:56:48
【问题描述】:

在下面的代码中,可以从嵌套的对象字面量中访问 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.
}

【问题讨论】:

  • 有趣。不确定它是否可以。

标签: javascript scope nested object-literal


【解决方案1】:

按照你说的方式 - 不。

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

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

【讨论】:

    【解决方案2】:

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

    主要原因是当您在inner 中时,outer 实际上还不存在。

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

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

    var outer = function() {
        this.x = 0;
        this.inner = {
            a: this.x + 1
        };                    
    };
    
    var b = new outer();
    
    console.log(b.inner.a); // 1
    

    【讨论】:

      【解决方案3】:

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

      var outer2;
      outer2.inner = outer.inner;
      

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

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

      【讨论】:

        【解决方案4】:

        你也可以使用闭包:

        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

        【讨论】:

          猜你喜欢
          • 2017-01-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-11-14
          • 2013-11-16
          相关资源
          最近更新 更多