Как получить доступ к внешнему члену из литерала вложенного объекта? - PullRequest
7 голосов
/ 13 марта 2011

В следующем коде можно ли получить доступ к члену 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 ]

9 голосов
/ 13 марта 2011

В том смысле, как вы это сформулировали - нет.

Вам нужно построить два этапа, это будет работать:

var outer = { x : 0 };
// outer is constructed at this point.
outer.inner = {
        b : outer.x + 1 // 'outer' is defined here.
};
4 голосов
/ 13 марта 2011

Не в той конструкции, которая у вас есть, нет.

Основная причина в том, что 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
0 голосов
/ 13 марта 2011

Вы также можете использовать замыкание:

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

0 голосов
/ 13 марта 2011

Я не думаю, что такая конструкция имела бы смысл. Я не думаю, что тебе что-то мешает сказать

var outer2;
outer2.inner = outer.inner;

В этом сценарии, как бы вы различали двух родителей?

Способ сделать это, вероятно, с помощью функции типа конструктора, с параметром, который назначается для external.x и inner.whwh что угодно.

...