2017-12-20 4 views
0

In einem einfachen JS Objekt wie folgt:Referenzierung eine interne Variable in einem JS Objekt

var LeadserData = { 
    agent_id: 2, 

    object_queries: { 
     emails: { 
      url: "/manual_emails/", 
      method: 'GET', 
       send_data: { 
        the_id: this.agent_id 
       } 
     } 
    } 
} 

es ist offensichtlich möglich, die agent_id einfach so zugreifen:

LeadserData.agent_id = 100; 
alert(LeadserData.agent_id); 

Das gibt natürlich 100. Aber warum funktioniert die interne Referenz von this.agent_id nicht?

Ich habe erwartet, dass dies auch als "100" herauskommt, aber stattdessen ist es undefiniert. Die ganze Geige ist hier: https://jsfiddle.net/h88zc5nw/1/

Was ist die Erklärung für dieses Verhalten, und wie kann ich dies optimieren, um die erwarteten 100 zurückgeben.

+0

'LeadserData.agent_id' ist nicht dasselbe wie' LeadserData.object_queries.emails.send_data.the_id'. Das Ändern eines wird sich nicht auf das andere auswirken, da es sich um zwei verschiedene Eigenschaften für zwei verschiedene Objekte handelt. –

+0

Die Syntax gibt keine Fehler zurück, die erwarten würden, dass dies geschehen würde, wenn diese.agent_id nicht gültig wäre. Ersetzen Sie es mit f ex "RandomVariable" wirft einen Fehler ... – charliez

+0

Es gibt keinen Fehler, weil es keinen Grund zu einem Fehler gibt. Der "this" -Wert verweist auf ein Objekt (höchstwahrscheinlich), aber nicht auf den gewünschten. –

Antwort

1

Zuerst verwenden Sie ein Objektliteral. Sie können this nicht innerhalb eines Objektliterals verwenden, zumindest wird es nicht sein, was Sie denken, dass es ist. Es wird wie immer this verfügbar sein, während das Objektliteral erstellt wird.

Zweitens, auch wenn wir davon ausgehen, dass das obige funktioniert, Zahlen sind native Typen, sie werden nicht über ihre Referenzen geteilt werden. Das Ändern von LeadserData.agent_id wirkt sich nicht auf LeadserData.object_queries.emails.send_data.the_id aus, auch wenn Sie dem anderen einen zugewiesen haben. Native Typen werden bei der Zuweisung kopiert und nicht mit einer Referenz weitergegeben (ähnlich wie bei einem Objekt).

+0

Vielen Dank für die Klarstellung . Nun, wie ich es verstehe, wird "the_id" dann auf den Wert von allem, auf das es verweist, "gesetzt", aber gibt es irgendeine Möglichkeit, es dynamisch abhängig von irgendeinem anderen Wert zu machen? Im obigen Beispiel würde ich gerne in der Lage sein, agent_id nur an einer Stelle zu deklarieren (da der tatsächliche Code eine Anzahl von object_queries haben wird) – charliez

+0

@charliez Warum würden Sie diese Eigenschaft den 'object_queries' hinzufügen? Sie alle bilden das gleiche Objekt, nur 'LeadserData.agent_id' ist ausreichend, nein? –

+0

Kein Problem, Sie sind willkommen ... Kasse dies, '(function() {var agent_id = 2, LeadserData = { object_queries: { E-Mails: { url: "/ manual_emails /", Methode: 'GET' send_data: { the_id: agent_id } } } }; console.log (LeadserData.object_queries.emails.send_data.die ID); })(); ' –

Verwandte Themen