2016-04-21 6 views
0

Betrachten Sie den folgenden Code ein:Wann wird das Objekt von einem get zurückgegeben?

var obj={ 
     prop1:7, 
     get prop2(){ 
      console.log('I ran'); 
      return {a:1,b:2}  
     } 
} 

Wenn wird das Objekt {a:1,b:2} erstellt zu werden?

Wenn der obige Code ausgeführt wird oder wenn wir explizit obj.prop2 ausführen? Ich bin auf diese Frage gestoßen, weil wir durch Schreiben obj.prop2.a 1 erhalten haben und ich kann dieses Verhalten nicht erklären. Wenn nicht obj.prop2 läuft, wie weiß es den Wert von obj.prop2.a?

Außerdem in Konsole wenn wir obj.prop2. nur schreiben es schlägt vor, für die automatische Vervollständigung, unter den anderen, a und b. Wie läuft das ab, da wir obj.prop2 nicht ausgeführt haben?

Antwort

6

Wenn das Objekt {a: 1, b: 2} erstellt wird? Durch Ausführen des obigen Codes oder wenn wir explizit obj.prop2 ausführen?

Letzteres, wenn wir auf obj.prop2 zugreifen, die die Getter-Funktion ausführt. Nicht zuletzt, weil jedes Mal, wenn der Zugang, haben Sie ein verschiedenen Objekt zurück:

var obj={ 
 
     prop1:7, 
 
     get prop2(){ 
 
      console.log('I ran'); 
 
      return {a:1,b:2}  
 
     } 
 
}; 
 
document.body.innerHTML = obj.prop2 == obj.prop2; // false

Es ist genau so:

// One: 
var obj = { 
    f: function() { 
     return {a:1, b:2}; 
    } 
}; 
// Two: 
obj.f(); 

Das Objekt {a:1, b:2} wird erstellt unter Two:, nicht One:. Und jedes Mal, wenn f() ausgeführt wird, wird ein neues erstellt.

in der Konsole, wenn wir nur obj.prop2 schreiben. es schlägt für die automatische Vervollständigung unter anderem a und b vor. Wie das passiert

Es liest die Eigenschaft. Es ist schließlich eine Eigenschaft, so wie die Konsole jede andere Eigenschaft liest, um ihren Wert zu erhalten und Autosuggest, liest sie diese Eigenschaft. Sie können das an Ihrem Beispiel sehen (zumindest in Chrome), weil "Ich lief" erscheint, wenn wir . nach obj.prop2 erreichen.

Versuchen Sie dies in Ihrer Konsole:

var obj = { 
    x: 1, 
    get prop() { 
     var o = {}; 
     ++this.x; 
     o["___" + this.x] = "foo"; 
     return o; 
    } 
}; 

Dann

obj.prop. 

geben ... und notieren Sie die Eigenschaft an der Spitze (wahrscheinlich) mit dem Namen ___1. Jetzt rücken Sie über die . und drücken Sie erneut .. Sie sehen eine andere Eigenschaft, ___2. Mach es noch einmal und du wirst ___3 sehen. Das liegt daran, dass die Konsole die Eigenschaft liest und die Getter-Funktion aufruft.

+0

Meine Frage wäre, warum würde jemand einen Getter verwenden, um ein Objekt zurückzugeben? – evolutionxbox

+0

@evolutionxbox Für eine Lazy-Objekt-Initialisierung oder zum Verbergen der internen Implementierung. Zum Beispiel ist obj .__ proto__ ein Getter. –

+0

Vielen Dank für die Antwort. Aber noch etwas. Ich bin mir immer noch nicht sicher, ob ich das Verhalten von "obj.prop2.a" ohne vorherige Ausführung von "obj.prop2" verstehe. Selbst in diesem Fall wird '{a: 1, b: 2}' erstellt? –

Verwandte Themen