Getters et Setters en JavaScript
Vue d'ensemble
Les récupérateurs et les régleurs en JavaScript sont utilisés pour définir propriétés calculées ou 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 consiste à faire 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'
Cette fonction est utile pour effectuer automatiquement des opérations en coulisses lors de l'accès à une propriété, comme le maintien des nombres dans une plage, le reformatage des chaînes de caractères, le déclenchement d'événements de modification de la valeur, la mise à jour des données relationnelles, l'accès aux propriétés privées, etc.
Les exemples ci-dessous montrent la syntaxe de base, bien qu'ils se contentent de récupérer et de définir la valeur interne de l'objet sans rien faire de spécial. Dans les cas réels, vous modifierez la valeur d'entrée et/ou de sortie en fonction de vos besoins, comme indiqué ci-dessus.
get/set Mots-clés
ECMAScript 5 prend en charge get
y set
mots-clés pour définir les propriétés calculées. Ils fonctionnent avec tous les navigateurs modernes, à l'exception d'IE 8 et des versions infé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
y 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 pour tous les navigateurs. Cela fonctionnera dans tous les navigateurs.
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 une telle chose, 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 : ...
};
Dans les exemples ci-dessus, les noms des propriétés internes sont abrégés par un trait de soulignement afin de décourager les utilisateurs de simplement faire foo.bar
vs. 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é à laquelle vous accédez (via l'attribut name
paramètre).
Object.defineProperty()
Utilisation de Object.defineProperty()
est un autre moyen d'ajouter des getters et setters, et peut être utilisé sur des objets après leur définition. Elle peut également être utilisée 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. Elle est dépréciée, mais toujours largement utilisée sur le web et ne risque donc pas de disparaître de sitôt. Elle fonctionne sur tous les navigateurs, à l'exception d'IE 10 et des versions inférieures. Bien que les autres options fonctionnent également bien sur les navigateurs autres que IE, celle-ci n'est donc pas très 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 afin d'éviter la récursion (c'est-à-dire que les noms des accesseurs doivent être différents des noms internes), foo.bar
en appelant foo.get(bar)
en appelant foo.bar
en appelant foo.get(bar)
...).
Voir aussi
MDN obtenir , set , Object.defineProperty() , __defineGetter__() , __defineSetter__()
MSDN Support du Getter IE8