2016-09-05 4 views
1

Ich muss auf eine Variable eines enthaltenden Elements in einer Funktion des untergeordneten Elements zugreifen. Wie kann ich das erreichen?JavaScript Zugriff Elternelement

object = { 
    a : { 
     c : function() { 
      //need to access b here 
     }, 
     d : 2 
    }, 
    b : 1 
}; 

In diesem Fall muss ich c die Variable b in der Funktion zuzugreifen. Ich habe einige Variationen mit bind() versucht, aber nichts hat funktioniert. Die Frage JavaScript access parent object attribute funktioniert nicht für mich. Ich kann die Variable object nicht erreichen, weil das Objekt tiefer verschachtelt ist.

+3

Sie müssen einen Verweis auf 'object' oder' b' übergeben oder einen Verweis auf 'b' zum' a' Objekt hinzufügen. Es sind keine integrierten Rückverweise verfügbar, um in eine Objekthierarchie zu gelangen. – Pointy

+2

Referenz mit diesem und dann Aufruf mit diesem Kontext wie in der verknüpften Frage nicht funktioniert? – Li357

+2

Nur Referenz 'object.b'? – Bergi

Antwort

1

Machen Sie a in einen Getter.

object = { 
    get a() { 
     var self = this; 
     return { 
     c: function() { 
      return self.b; 
     }, 
     d: 2 
     } 
    }, 
    b : 1 
}; 

Oder, wenn c muss keine this zum Beispiel d, Bezug zu nehmen, dann

object = { 
    get a() { 
     return { 
     c:() => this.b, 
     d: 2 
     } 
    }, 
    b : 1 
}; 
+2

Dies hat die hässliche Eigenschaft von 'object.a! == object.a' – Bergi

1

Es spielt keine Rolle, dass object tief verschachtelten ist. Verwenden Sie einfach object.b.

var object; 
 
([{a:[{b:[{c:[{d:[{e:[{f: // deeply nested 
 
    object = { 
 
    a: { 
 
     c: function() { 
 
     console.log(object.b); 
 
     }, 
 
     d: 2 
 
    }, 
 
    b: 1 
 
    } 
 
}]}]}]}]}]}])[0].a[0].b[0].c[0].d[0].e[0].f.a.c();

0

mag ich Oriol Antwort. :-)

Eine weitere Alternative zum Verschluss.

([{a:[{b:[{c:[{d:[{e:[{f: // deeply nested 
 
    (function(){ 
 
    var object = { 
 
     a: { 
 
     c: function() { 
 
      console.log(object.b); 
 
     }, 
 
     d: 2 
 
     }, 
 
     b: 1 
 
    } 
 
    return object; 
 
    })() 
 
}]}]}]}]}]}])[0].a[0].b[0].c[0].d[0].e[0].f.a.c();

Oder Sie können die Objekterstellung in eine separate Funktion bewegen, wenn das Sinn macht (können Sie diese Funktion nennen).

function createHierarchy(){ 
 
    return ([{a:[{b:[{c:[{d:[{e:[{f:createObject()}]}]}]}]}]}]); 
 
} 
 

 
function createObject(){ 
 
    var object = { 
 
     a: { 
 
     c: function() { 
 
      console.log(object.b); 
 
     }, 
 
     d: 2 
 
     }, 
 
     b: 1 
 
    } 
 
    return object; 
 
} 
 

 
var hierarchy = createHierarchy(); 
 
hierarchy[0].a[0].b[0].c[0].d[0].e[0].f.a.c();

ein DI-Container Mit nur einem einzigen Schritt von hier. :-P

Es kann vorkommen, dass Sie eine graph anstelle einer hierarchy benötigen und Ihr Modell ist völlig falsch.