Ich bin verwirrt darüber, wozu Getter und Setter in ECMAScript 6-Klassen gut sind. Was ist der Zweck? Unten ist ein Beispiel, auf das ich mich beziehe:
class Employee {
constructor(name) {
this._name = name;
}
doWork() {
return `${this._name} is working`;
}
get name() {
return this._name.toUpperCase();
}
set name(newName){
if(newName){
this._name = newName;
}
}
}
class
ecmascript-6
setter
getter
TruMan1
quelle
quelle
Antworten:
Mit diesem Setter und Getter können Sie die Eigenschaften direkt verwenden (ohne die Klammer zu verwenden).
Dies dient nur zum Festlegen und Abrufen des Werts der Eigenschaft.
quelle
set name(newName) { this._name = newName; }
Get:get name() { return this._name.toUpperCase(); }
Getter und Setter in ES6 dienen demselben Zweck wie in anderen Sprachen ... einschließlich ES5. ES5 erlaubt Getter und Setter bereits über
Object.defineProperty
, obwohl sie weniger sauber und umständlicher zu bedienen sind.Getter und Setter ermöglichen es Ihnen effektiv, die Standardnotation für den Zugriff auf Eigenschaften für Lese- und Schreibvorgänge zu verwenden, während Sie dennoch anpassen können, wie die Eigenschaft abgerufen und mutiert wird, ohne dass explizite Getter- und Setter-Methoden erforderlich sind.
In der obigen Mitarbeiterklasse bedeutet dies, dass Sie wie folgt auf die
name
Eigenschaft zugreifen können:Es würde wie ein normaler Eigenschaftszugriff aussehen , aber es würde tatsächlich
toUpperCase
den Namen aufrufen, bevor es zurückgegeben wird. In ähnlicher Weise:würde auf den Setter zugreifen und die interne
_name
Eigenschaft aufgrund der inname
Setter eingeführten Schutzklausel nicht ändern .Siehe auch die allgemeine Frage Warum Getter und Setter verwenden? Weitere Informationen dazu, warum es hilfreich ist, die Funktionalität des Mitgliederzugriffs zu ändern.
quelle
ES6-Getter und -Setter haben eine wesentlich andere Motivation als ähnliche Konzepte in Java.
In Java ermöglichen Getter und Setter einer Klasse, eine JavaBean zu definieren. Der Punkt von Gettern und Setzern ist, dass die Bean eine vollständig orthogonale "Schnittstelle" von der durch öffentliche Felder implizierten haben kann. Ich kann also ein Feld "name" haben, das KEINE JavaBean-Eigenschaft ist, und ich kann eine JavaBean-Eigenschaft "address" haben, die KEIN Feld ist.
JavaBean-Eigenschaften können auch von Tausenden von Frameworks (z. B. Hibernate) über Java Reflection "entdeckt" werden. Daher sind Getter und Setter Teil einer Standardmethode zum "Freilegen" von Bohneneigenschaften.
Getter und Setter haben als Funktionen auch den Wert, dass sie die Implementierung "abstrahieren". Es kann entweder ein Feld oder ein berechneter ("synthetischer") Wert sein. Wenn ich also eine Bean-Eigenschaft namens "Postleitzahl" habe, beginnt diese als gespeicherte Zeichenfolge. Angenommen, ich möchte es in einen Wert ändern, der aus Adresse / Stadt / Bundesland berechnet wird.
Wenn ich ein Feld verwende, wird dieser Code unterbrochen:
Aber wenn ich einen Getter benutze, bricht das nicht:
JavaScript hat nichts wie JavaBeans. Soweit ich gelesen habe, ist der beabsichtigte Wert von GET und SET auf die oben genannten "synthetischen" (berechneten) Eigenschaften beschränkt.
Aber es ist etwas besser als Java, da Java es Ihnen nicht erlaubt, ein "Feld" kompatibel in eine Methode zu konvertieren, ES6 GET und SET dies jedoch zulassen.
Das heißt, wenn ich habe:
Wenn ich die Postleitzahl von einer Standardobjekteigenschaft in einen Getter ändere, ruft der obige Code jetzt die GET-Funktion auf.
Beachten Sie, dass wenn ich GET nicht in die Definition aufgenommen hätte, dies NICHT die Postleitzahl-GET-Methode aufrufen würde. Stattdessen würde es lediglich die Postleitzahl der Funktion der var zuweisen.
Daher denke ich, dass dies einige wichtige Unterscheidungen sind, um zwischen Java- und JavaScript ES6-Get- und -Setzern zu verstehen.
quelle
Jedenfalls ist das
getter
undsetter
wie ein Spion. Es erkennt die Eigenschaft eines Objekts, sodass Sie jedes Mal etwas tun können, wenn Sie den Wert der Eigenschaft abrufen oder festlegen.quelle