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:
var user = { /* ... object with getters and setters ... */ };
user.phone = '+1 (123) 456-7890'; // updates a database
console.log( user.areaCode ); // displays '123'
console.log( user.area ); // displays 'Anytown, USA'
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
und set
Schlüsselwörter zum Definieren berechneter Eigenschaften. Sie funktionieren mit allen modernen Browsern außer IE 8 und niedriger.
var foo = {
bar : 123,
get bar(){ return bar; },
set bar( value ){ this.bar = value; }
};
foo.bar = 456;
var gaz = foo.bar;
Benutzerdefinierte Getter und Setter
get
und set
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.
var foo = {
_bar : 123,
get : function( name ){ return this[ '_' + name ]; },
set : function( name, value ){ this[ '_' + name ] = value; }
};
foo.set( 'bar', 456 );
var gaz = foo.get( 'bar' );
Oder für einen kompakteren Ansatz kann eine einzelne Funktion verwendet werden.
var foo = {
_bar : 123,
value : function( name /*, value */ ){
if( arguments.length < 2 ){ return this[ '_' + name ]; }
this[ '_' + name ] = value;
}
};
foo.value( 'bar', 456 );
var gaz = foo.value( 'bar' );
Vermeiden Sie so etwas, da dies zu einem Aufblähen des Codes führen kann.
var foo = {
_a : 123, _b : 456, _c : 789,
getA : function(){ return this._a; },
getB : ..., getC : ..., setA : ..., setB : ..., setC : ...
};
In den obigen Beispielen werden die internen Eigenschaftsnamen mit einem Unterstrich abstrahiert, um Benutzer davon abzuhalten, einfach foo.bar
vs. zu tun foo.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 den name
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.
var foo = { _bar : 123 };
Object.defineProperty( foo, 'bar', {
get : function(){ return this._bar; },
set : function( value ){ this._bar = value; }
} );
foo.bar = 456;
var gaz = foo.bar;
__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.
var foo = { _bar : 123; }
foo.__defineGetter__( 'bar', function(){ return this._bar; } );
foo.__defineSetter__( 'bar', function( value ){ this._bar = value; } );
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 , Aufrufen foo.get(bar)
, foo.bar
Aufrufen)foo.get(bar)
...).
Siehe auch
MDN get , set ,
Object.defineProperty () , __defineGetter __ () , __defineSetter __ ()
MSDN
IE8 Getter Support