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.
Meine Frage wäre, warum würde jemand einen Getter verwenden, um ein Objekt zurückzugeben? – evolutionxbox
@evolutionxbox Für eine Lazy-Objekt-Initialisierung oder zum Verbergen der internen Implementierung. Zum Beispiel ist obj .__ proto__ ein Getter. –
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? –