Getters et Setters en JavaScript
Aperçu
Les getters et les setters en JavaScript sont utilisés pour définir des propriétés calculées ou des accesseurs . Une propriété calculée est une propriété qui utilise une fonction pour obtenir ou définir une valeur d'objet. La théorie de base fait quelque chose comme ceci:
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'
Ceci est utile pour faire automatiquement des choses en arrière-plan lors de l'accès à une propriété, comme garder des nombres dans la plage, reformater des chaînes, déclencher des événements de valeur a changé, mettre à jour des données relationnelles, donner accès à des propriétés privées, etc.
Les exemples ci-dessous montrent la syntaxe de base, bien qu'ils obtiennent et définissent simplement la valeur d'objet interne sans rien faire de spécial. Dans des cas réels, vous modifieriez la valeur d'entrée et / ou de sortie en fonction de vos besoins, comme indiqué ci-dessus.
obtenir / définir des mots clés
ECMAScript 5 prend en charge get
et set
mots - clés pour définir les propriétés calculées. Ils fonctionnent avec tous les navigateurs modernes sauf IE 8 et les versions antérieures.
var foo = {
bar : 123,
get bar(){ return bar; },
set bar( value ){ this.bar = value; }
};
foo.bar = 456;
var gaz = foo.bar;
Getters et Setters personnalisés
get
et set
ne sont pas des mots réservés, ils peuvent donc être surchargés pour créer vos propres fonctions de propriétés personnalisées et calculées entre navigateurs. Cela fonctionnera dans n'importe quel navigateur.
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' );
Ou pour une approche plus compacte, une seule fonction peut être utilisée.
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' );
Évitez de faire quelque chose comme ça, ce qui peut entraîner un gonflement du code.
var foo = {
_a : 123, _b : 456, _c : 789,
getA : function(){ return this._a; },
getB : ..., getC : ..., setA : ..., setB : ..., setC : ...
};
Pour les exemples ci-dessus, les noms de propriétés internes sont abstraits avec un trait de soulignement afin de décourager les utilisateurs de simplement faire foo.bar
contre foo.get( 'bar' )
et obtenir une valeur "non cuite". Vous pouvez utiliser du code conditionnel pour faire différentes choses en fonction du nom de la propriété en cours d'accès (via le name
paramètre).
Object.defineProperty ()
L'utilisation Object.defineProperty()
est une autre façon d'ajouter des getters et des setters, et peut être utilisée sur des objets après leur définition. Il peut également être utilisé pour définir des comportements configurables et énumérables. Cette syntaxe fonctionne également avec IE 8, mais malheureusement uniquement sur les objets DOM.
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 __ ()
Enfin, __defineGetter__()
est une autre option. Il est obsolète, mais toujours largement utilisé sur le Web et donc peu susceptible de disparaître de sitôt. Il fonctionne sur tous les navigateurs sauf IE 10 et les versions antérieures. Bien que les autres options fonctionnent également bien sur les non-IE, celle-ci n'est donc pas si utile.
var foo = { _bar : 123; }
foo.__defineGetter__( 'bar', function(){ return this._bar; } );
foo.__defineSetter__( 'bar', function( value ){ this._bar = value; } );
Il convient également de noter que dans ces derniers exemples, les noms internes doivent être différents des noms des accesseurs pour éviter la récursivité (c'est-à-dire, foo.bar
appeler foo.get(bar)
appeler foo.bar
appeler foo.get(bar)
...).
Voir également
MDN get , set ,
Object.defineProperty () , __defineGetter __ () , __defineSetter __ ()
MSDN
IE8 Getter Support