2017-11-21 2 views
0

ich versucht, diesen kleinen Teil des Codes in meinem Browser-Konsole auszuführen:Javascript Objekt Getter

a = {b: 1} 
 
Object.defineProperty(a, 'b', { get: function() { console.log(5); } }) 
 
c = a.b 
 
c 
 
c

Jedesmal, wenn ich zu nennen pflegte 'c' varaible, ich bin nicht immer console.log (5) ausgeführt werden. Das heißt mein Getter ruft nicht an. Ich denke, das könnte sein, weil ich a.b nicht direkt anrufe, sondern stattdessen die c-Variable verwende. Kann jemand meine Gedanken bestätigen/ablehnen? Auch, wie kann ich caller getter machen, wenn ich c anrufe?

Danke.

+0

Sie haben 'a.b' zugewiesen zu' c'. Das ist, wenn Ihr Getter aufgerufen wird. Und wenn der get-Wert "c" zugewiesen ist. 'c' verhält sich wie jede andere Variable. –

Antwort

2

Kann jemand bestätigen/ablehnen meine Gedanken

Sie erhalten console.log(5) Lauf jedes Mal, wenn Sie a.b nennen. Aber wenn Sie c = a.b verwenden, führt dies die Funktion, kopiert das Ergebnis in die c (die undefined ist) und von hier c hat seinen unabhängigen Wert, der über a.b zurückgegeben wird. Also danach jedes Mal, wenn Sie c anrufen, bewerten Sie c und erhalten den Wert davon, nicht die a.b. In wenigen Worten c hat nichts mehr mit a.b.

Auch wie kann ich es rufen Getter jedes Mal, wenn ich c rufe?

Eigentlich gibt es keine Lösung. Eine Sache, die Sie tun können, ist die Rückgabe einer Funktion, die das Ergebnis protokolliert, aber jetzt müssen Sie c aufrufen, damit es funktioniert. Vielleicht kannst du deine Logik irgendwo ändern, also ist das kein guter Workaround.

const a = {b: 1} 
 
Object.defineProperty(a, 'b', { get: function() { 
 
     console.log(5); 
 
     return() => console.log(5); 
 
    } 
 
}); 
 
const c = a.b; 
 
c(); 
 
c();

0

Sie sind nur get ting b einmal, und das zurückgegebene Wert zuweisen, in diesem Fall undefined, zu c.

Der Getter wird nicht mehr aufgerufen, wenn Sie danach mit c arbeiten.

Verwandte Themen