2012-08-29 18 views
5

Tengo un objeto anidado en javascript como éste:Javascript acceso a objetos anidada nivel de la raíz

{ 
nameRoot: "my object", 
sub: { 
    nameSub: "my sub object" 
} 
} 

quiero acceder nameRoot de una función definida en sub.

Utilizando una función que habría definido algo como:

var self = this; 

y usado auto, pero ¿cómo puedo hacer esto en un objeto literal?

+0

No lo creo posible. No sé de la publicación en la parte superior de mi cabeza, pero recuerdo haber leído esto en StackOverflow recientemente. ¿Puedes definir ese objeto como una función, en lugar de un objeto literal? – Brad

+2

No puedes. Pero un objeto no es sin referencia, por lo que en algún lugar debe tener una referencia al objeto en el que se encuentra, ¿no? – David

+1

Esta es también la razón por la cual los nodos y tales necesitan tener una referencia explícita a 'parentNode'. – voithos

Respuesta

1

El siguiente código le permite vincular a un elemento principal y evitar que el elemento principal se muestre en un bucle for-in.

var parent = { a: 1 }; 
var child = { b: 2 }; 

Object.defineProperty(
    child, 'parent', 
    { value: parent, 
     enumerable: false } 
); 

parent.child = child; 

child.performAction = function() { 
    console.log(this.parent.a) // 1 
} 
0

Así que la mejor manera de hacerlo es con el alcance de la función.

function myFunc(){ 
    this.nameRoot = "my object"; 
} 

entonces se podría hacer algo como:

var func = new myFunc(); 
func.sub = new myFunc(); 
func.sub.nameRoot = "my sub object"; 

Es obvio que hay formas más inteligentes de hacerlo (por ejemplo, pasar el nombre a través de la función params) pero este es el patrón general.

+0

Pregunta: _pero cómo puedo hacer esto en un "objeto literal" _ –

+0

No puedes, es por eso que dije que lo hiciera de la manera que sugerí. – Paul

Cuestiones relacionadas