2011-03-13 5 views
7

En el siguiente código, ¿se puede acceder al miembro x desde el literal del objeto anidado?¿Cómo acceder a un miembro externo desde un literal de objeto anidado?

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. 
} 
+0

Int eresting. No estoy seguro si puede en absoluto. –

Respuesta

9

En la forma en que lo pones - no.

Se necesitan dos etapas de la construcción, esto va a funcionar:

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

No en la construcción que tiene, no.

La razón principal es que outer no existe aún cuando estás dentro de inner.

Si cambiaste las propiedades de inner a funciones, podrías acceder a outer en tiempo de ejecución, pero sería un código bastante feo.

Considere el uso de new outer(); lugar y construir un objeto de esa manera, entonces se puede utilizar en el interior thisinner, pero eso es una construcción completamente diferente y sería algo como

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

var b = new outer(); 

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

No creo que ese tipo de construcción tendría sentido. No creo que haya nada que nos impida diciendo

var outer2; 
outer2.inner = outer.inner; 

En ese escenario, ¿cómo distinguir entre los dos padres?

La forma de hacerlo es probablemente con más de una función de tipo constructor, con un parámetro que se asigna a outer.x e inner.whatever según sea necesario.

0

También es posible usar un cierre:

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 

Para un gran artículo sobre el cierre echa un vistazo a el jardín Javascript

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

Cuestiones relacionadas