2011-02-03 11 views

Respuesta

20

Try referencia parentObj directamente:

var parentObj = { 
    attr1: 1, 
    attr2: 2, 
    childObj: { 
     method1: function() { 
     return parentObj.attr1 * parentObj.attr2; 
     } 
    } 
} 
22

Esto puede hacerse con el poder de los cierres!

var Construct = function() { 
    var self = this;  

    this.attr1 = 1; 
    this.attr2 = 2; 
    this.childObj = { 
     method1: function() { 
      return self.attr1 * self.attr2 
     } 
    } 
} 


var obj = new Construct(); 
+1

@Matt: Solo para tu información, los '()' son opcionales con 'nuevo'. : o) – user113716

+0

@patrick: lo sé. Sin embargo, creo que es un estilo pobre, y [no soy el único] (http://stackoverflow.com/questions/3034941/new-myclass-vs-new-myclass). No veo una buena razón para este tipo de "característica" del lenguaje. –

+0

@Matt: Bien. Sería una buena idea tener en cuenta que en * Editar resumen *, especialmente cuando se trata de una edición de estilo personal. – user113716

15
var parentObj = { 
    attr1:1, 
    attr2:2, 
    childObj:{ 
     method1:function(){ 
      return this.parent.attr1 * this.parent.attr2; 
     } 
    }, 
    init:function(){ 
     this.childObj.parent = this; 
     delete this.init; 
     return this; 
    } 
}.init(); 
+2

excelente! muy elegante e inteligente. –

+1

¿Por qué 'borrar this.init'? – Banago

+1

Es solo limpieza, así que cuando recuperas tu objeto, no tiene una función de inicio inútil que solo se usó en la creación de objetos. –

4

Hay un problema con referencia a los padres objeto mi nombre porque rompe la aplicación en caso de que cambie de nombre. Este es el enfoque más agradable, que utilizo extensivamente, donde se pasa la matriz como un argumento para el método niño init:

var App = { 
    init: function(){  
    this.gallery.init(this); 
    }, 

    somevar : 'Some Var' 
} 

App.gallery = { 
    init: function(parObj){ 
    this.parent = parObj; 
    console.log(this.parent.somevar); 
    } 

} 

App.init(); 
6

Este es un otro enfoque sin hacer referencia el nombre del objeto padre.

var parentObj = { 
    attr1: 1, 
    attr2: 2, 
    get childObj() { 
     var self = this; 
     return { 
      method1: function() { 
       return self.attr1 * self.attr2; 
      } 
     } 
    } 
} 

se puede acceder a:

parentObj.childObj.method1(); // returns 2 
Cuestiones relacionadas