2011-02-03 6 views

Odpowiedz

20

Spróbuj przedstawieniu parentObj bezpośrednio:

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

Można to zrobić z mocą zamknięć!

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: Tylko FYI, '()' są opcjonalne z 'new'. : o) – user113716

+0

@patrick: Wiem o tym. Jednak myślę, że to kiepski styl i [nie jestem jedyny] (http://stackoverflow.com/questions/3034941/new-myclass-vs-new-myclass). Nie widzę żadnego powodu dla tego rodzaju "funkcji" językowej. –

+0

@Matt: W porządku. Dobrym pomysłem byłoby odnotowanie tego w * Edytowaniu podsumowania *, zwłaszcza gdy jest to edycja stylu osobistego. – 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

doskonałe! bardzo elegancki i sprytny. –

+1

Dlaczego "usuwasz this.init"? – Banago

+1

To po prostu czyszczenie, więc gdy odzyskasz swój obiekt, nie ma on bezużytecznej funkcji init, która była używana tylko przy tworzeniu obiektu. –

4

Jest problem ze przedstawieniu rodzic sprzeciw moje imię, ponieważ łamie to aplikacja w przypadku zmiany nazwy. Tutaj jest ładniejszy podejście, którego używam obszernie, gdzie można przekazać jako argument rodzica do dziecka init metody:

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

Jest to inne podejście bez odwoływania się nazwę obiektu nadrzędnego.

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

Może być dostępna jako:

parentObj.childObj.method1(); // returns 2 
Powiązane problemy