Ich habe versucht , meinen Kopf um Getter und Setter und sein nicht versinken in bekommen. Ich habe gelesen , JavaScript Getter und Setter und Definieren von Getter und Setter und einfach nicht zu bekommen.
Kann jemand klar sagen:
- Was für ein Getter und Setter sollen und
- Geben Sie einige sehr einfache Beispiele?
javascript
setter
getter
Alexander Abakumov
quelle
quelle
a = setValue(5);
mita = 5;
undsetValue()
würde damit unter der Haube genannt werden , zu tun , was Sie wollen.Antworten:
Zusätzlich zur Antwort von @ millimoose können Setter auch zum Aktualisieren anderer Werte verwendet werden.
Jetzt können Sie festlegen
fullName
,first
undlast
wird aktualisiert und umgekehrt.quelle
Object.defineProperty
Funktion unterstützt, mit der Getter und Setter definiert werden können.this.__defineGetter__
die neuereObject.defineProperty
Funktion verwenden.Name.prototype.constructor
? Scheint eine schlechte Alternative zu Millimooses Antwort zu sein .Getter und Setter in JavaScript
Überblick
Getter und Setter in JavaScript werden zum Definieren berechneter Eigenschaften oder Accessoren verwendet . Eine berechnete Eigenschaft verwendet eine Funktion, um einen Objektwert abzurufen oder festzulegen. Die Grundtheorie macht ungefähr so:
Dies ist nützlich, um beim Zugriff auf eine Eigenschaft automatisch Dinge hinter den Kulissen zu erledigen, z. B. Zahlen im Bereich zu halten, Zeichenfolgen neu zu formatieren, Ereignisse mit Wertänderungen auszulösen, relationale Daten zu aktualisieren, Zugriff auf private Eigenschaften zu gewähren und vieles mehr.
Die folgenden Beispiele zeigen die grundlegende Syntax, obwohl sie einfach den internen Objektwert abrufen und festlegen, ohne etwas Besonderes zu tun. In realen Fällen würden Sie den Eingabe- und / oder Ausgabewert wie oben angegeben an Ihre Anforderungen anpassen.
Schlüsselwörter abrufen / festlegen
ECMAScript 5 unterstützt
get
undset
Schlüsselwörter zum Definieren berechneter Eigenschaften. Sie funktionieren mit allen modernen Browsern außer IE 8 und niedriger.Benutzerdefinierte Getter und Setter
get
undset
sind keine reservierten Wörter, daher können sie überladen werden, um Ihre eigenen benutzerdefinierten, browserübergreifend berechneten Eigenschaftsfunktionen zu erstellen. Dies funktioniert in jedem Browser.Oder für einen kompakteren Ansatz kann eine einzelne Funktion verwendet werden.
Vermeiden Sie so etwas, da dies zu einem Aufblähen des Codes führen kann.
In den obigen Beispielen werden die internen Eigenschaftsnamen mit einem Unterstrich abstrahiert, um Benutzer davon abzuhalten, einfach
foo.bar
vs. zu tunfoo.get( 'bar' )
und einen "ungekochten" Wert zu erhalten. Sie können bedingten Code verwenden, um abhängig vom Namen der Eigenschaft, auf die zugegriffen wird (über denname
Parameter), verschiedene Aufgaben auszuführen .Object.defineProperty ()
Die Verwendung
Object.defineProperty()
ist eine weitere Möglichkeit, Getter und Setter hinzuzufügen, und kann für Objekte verwendet werden, nachdem sie definiert wurden. Es kann auch verwendet werden, um konfigurierbare und aufzählbare Verhaltensweisen festzulegen. Diese Syntax funktioniert auch mit IE 8, aber leider nur für DOM-Objekte.__defineGetter __ ()
Schließlich
__defineGetter__()
ist eine andere Option. Es ist veraltet, wird aber im Internet immer noch häufig verwendet und wird daher wahrscheinlich nicht so schnell verschwinden. Es funktioniert in allen Browsern außer IE 10 und darunter. Obwohl die anderen Optionen auch auf Nicht-IE gut funktionieren, ist diese nicht so nützlich.Erwähnenswert ist auch, dass in den letzteren Beispielen die internen Namen von den Zugriffsnamen abweichen müssen, um eine Rekursion zu vermeiden (dh
foo.bar
Aufrufen , Aufrufenfoo.get(bar)
,foo.bar
Aufrufen)foo.get(bar)
...).Siehe auch
MDN get , set , Object.defineProperty () , __defineGetter __ () , __defineSetter __ ()
MSDN IE8 Getter Support
quelle
this[ '_' + name ] = value;
könntethis[ '_' + name ] = arguments[1];
und es gäbe keine Notwendigkeit zu geben seinvalue
arg.var foo = { bar : 123, get bar(){ return bar; }, set bar( value ){ this.bar = value; } }; foo.bar = 456;
Löst eine Ausnahme aus: Nicht erfasster RangeError: Die maximale Größe des Aufrufstapels wurde in der Object.set-Leiste [als Balken] (<anonym>: 4: 32) in der Object.set-Leiste [als Balken] (<anonym>: 4: 32) überschritten ) an der Object.set-Leiste [als Leiste] (<anonym>: 4: 32) an der Object.set-Leiste [als Leiste] (<anonymous>: 4: 32) an der Object.set-Leiste [als Leiste] (<anonymous>) : 4: 32) bei Object.set bar [als bar] (<anonymous>: 4: 32)bar: 123
undthis.bar = value
etc. ändern Sie diese zum_bar
Beispiel. Siehe: hongkiat.com/blog/getters-setters-javascript_foo
oder benanntmFoo
. Wenn es dasselbe ist wie der Getter / Setter, verursacht es aufgrund der Rekursion eine Endlosschleife und dann einen Stack Overflow ™ ;-), denn wenn Sie a = b sagen, ruft es a.get (b) auf, das selbst a = b aufruft , der a.get (b) nennt, ...Sie würden sie beispielsweise verwenden, um berechnete Eigenschaften zu implementieren.
Beispielsweise:
(CodePen)
quelle
Object.defineProperties
.Es tut mir leid, eine alte Frage wiederzubeleben, aber ich dachte, ich könnte ein paar sehr grundlegende Beispiele und Erklärungen für Dummies beisteuern. Keine der anderen bisher veröffentlichten Antworten veranschaulicht die Syntax wie der MDN-Leitfaden erste Beispiel , ist.
Getter:
... wird sich
John Smith
natürlich anmelden . Ein Getter verhält sich wie eine variable Objekteigenschaft, bietet jedoch die Flexibilität einer Funktion, um ihren zurückgegebenen Wert im laufenden Betrieb zu berechnen. Es ist im Grunde eine ausgefallene Möglichkeit, eine Funktion zu erstellen, die beim Aufrufen nicht () erfordert.Setter:
... wird sich
New York
an der Konsole anmelden . Wie Getter, Setter werden mit derselben Syntax aufgerufen wie der Wert einer Objekteigenschaft, sind jedoch eine weitere ausgefallene Möglichkeit, eine Funktion ohne () aufzurufen.Siehe diese jsfiddle ein gründlicheres, vielleicht praktischeres Beispiel. Das Übergeben von Werten an den Objekt- Setter löst die Erstellung oder Auffüllung anderer Objektelemente aus. Insbesondere im jsfiddle-Beispiel fordert das Übergeben eines Arrays von Zahlen den Setter auf, Mittelwert, Median, Modus und Bereich zu berechnen. Legt dann die Objekteigenschaften für jedes Ergebnis fest.
quelle
maps.roll
als Eigentum und nicht alsmaps.roll()
Rückgabewert abzurufen. Es ist nur eine Präferenz.maps.roll()
Getter und Setter sind wirklich nur dann sinnvoll, wenn Sie private Eigenschaften von Klassen haben. Da Javascript nicht wirklich private Klasseneigenschaften hat, wie Sie es normalerweise von objektorientierten Sprachen erwarten, kann es schwer zu verstehen sein. Hier ist ein Beispiel für ein privates Zählerobjekt. Das Schöne an diesem Objekt ist, dass von außerhalb des Objekts nicht auf die interne Variable "count" zugegriffen werden kann.
Wenn Sie immer noch verwirrt sind, lesen Sie den Artikel von Crockford über private Mitglieder in Javascript .
quelle
var baz = foo.bar
, dass ein komplettes Set versteckter Verhaltensweisen dahinter steckt. Das würde ich allerdings erwartenfoo.getBar()
.Ich denke, der erste Artikel, auf den Sie verlinken, sagt es ziemlich deutlich aus:
Das Ziel hierbei ist es, die Felder zu kapseln und zu abstrahieren, indem nur über eine
get()
oder eineset()
Methode auf sie zugegriffen wird. Auf diese Weise können Sie das Feld / die Daten intern beliebig speichern, externe Komponenten befinden sich jedoch nur außerhalb Ihrer veröffentlichten Schnittstelle. Auf diese Weise können Sie interne Änderungen vornehmen, ohne die externen Schnittstellen zu ändern, eine Validierung oder Fehlerprüfung innerhalb derset()
Methode durchführen usw.quelle
Obwohl wir es oft gewohnt sind, Objekte mit öffentlichen Eigenschaften ohne Zugriffskontrolle anzuzeigen, können wir mit JavaScript Eigenschaften genau beschreiben. Tatsächlich können wir Deskriptoren verwenden, um zu steuern, wie auf eine Eigenschaft zugegriffen werden kann und welche Logik wir auf sie anwenden können. Betrachten Sie das folgende Beispiel:
Das Endergebnis:
quelle
Was daran so verwirrend ist ... Getter sind Funktionen, die aufgerufen werden, wenn Sie eine Eigenschaft erhalten, Setter, wenn Sie sie festlegen. Beispiel, wenn Sie dies tun
Sie setzen die Eigenschaft prop, wenn Sie Getter / Setter verwenden, wird die Setter-Funktion mit "abc" als Argument aufgerufen. Die Definition der Setterfunktion innerhalb des Objekts würde im Idealfall ungefähr so aussehen:
Ich bin mir nicht sicher, wie gut das in allen Browsern implementiert ist. Es scheint, dass Firefox auch eine alternative Syntax hat, mit doppelt unterstrichenen speziellen ("magischen") Methoden. Wie üblich unterstützt Internet Explorer dies nicht.
quelle
Sie können die Instanzmethode für die Klasse js über den Prototyp des Konstruktors definieren.
Es folgt der Beispielcode:
Und dies sollte für jeden Browser funktionieren. Sie können diesen Code auch einfach mit nodejs ausführen.
quelle
Ich war auch etwas verwirrt über die Erklärung, die ich gelesen habe , weil ich versucht habe, einem vorhandenen Prototyp, den ich nicht geschrieben habe, eine Eigenschaft hinzuzufügen, sodass das Ersetzen des Prototyps als falscher Ansatz erschien. Also, für die Nachwelt, hier ist , wie ich hinzugefügt
last
Eigenschaft aufArray
:Etwas schöner als das Hinzufügen einer Funktion IMHO.
quelle
Wenn Sie sich auf das Konzept der Accessoren beziehen, besteht das einfache Ziel darin, den zugrunde liegenden Speicher vor willkürlichen Manipulationen zu verbergen. Der extremste Mechanismus dafür ist
Wenn Sie sich auf die eigentliche JS-Getter / Setter-Funktion beziehen, z.
defineGetter
/defineSetter
, oder{ get Foo() { /* code */ } }
, dann ist es erwähnenswert, dass in den meisten modernen Motoren die spätere Nutzung dieser Eigenschaften viel langsamer ist als sonst. z.B. Vergleichen Sie die Leistung vonvs.
quelle
Ich habe eine für euch, die vielleicht etwas hässlich ist, aber plattformübergreifend erledigt wird
auf diese Weise, wenn Sie anrufen
Wenn Sie die Dinge wirklich aufpeppen möchten, können Sie eine Art Scheck einfügen:
Oder gehen Sie noch verrückter mit dem erweiterten Typ-of- Check: type.of () -Code auf codingforums.com
quelle