Properties & Javascript
Il y a quelques mois j'avais fait un petit tuto sur comment coder orienté objet avec javascript : http://www.k33g.org/?q=node/42. Ce qui me manquait, c'était la notion de propriétés (je viens de .Net). Et bien, c'est possible ! Je vous livre 3 méthodes différentes (qui ne fonctionne pas forcément sur tous les navigateurs, mobiles compris)
Habituellement, on fait comme ceci :
function Human(name){
var _name = name;
this.getName = function(){return _name;};
this.setName = function(value){_name = value;};
}
H = new Human("Donald");
alert(H.getName());
...
Mais il est possible de faire ceci :
//OK sous Webkit et Mozilla, pas testé sous Webkit mobile
//KO sous IE
function Human(name){
var _name = name;
this.__defineGetter__("Name",
function(){
return _name;
});
this.__defineSetter__("Name",
function(value){
_name = value;
});
}
H = new Human("Donald");
alert(H.Name);
Ou bien ceci :
//OK sous Webkit et Mozilla, KO sous Webkit mobile
//KO sous IE
function Human(name){
var _name = name;
Object.defineProperty(this, "Name", {
get: function() { return _name; },
set: function(value) { _name = value;}
});
}
H = new Human("Donald");
alert(H.Name);
Si vous êtes prêts à abandonner le concept de variables privées, il y a aussi cette solution :
//OK sous Webkit et Mozilla, pas testé sous Webkit mobile
//KO sous IE
function Human(name){
this._name = name;
}
Human.prototype = {
get Name() { return _name; },
set Name(value) { _name = value;}
}
H = new Human("Donald");
alert(H.Name);
L'avantage c'est que vous devez pouvoir l'utiliser facilement dans du code Mootools (reste à tester).
Je ne connaissais pas, et personnellement, ça me plaît beaucoup.
Mais, si vous voulez rester compatibles "tous navigateurs" je vous propose de le faire "à la jQuery" (et ça vous fera économiser quelques get et set) :
cet exemple est faux (cf. commentaires)
function Human(name){
this._name = name;
this.Name = function(){
if(arguments[0]!=null){//setter
this._name = arguments[0]
return null;
}else{//getter
return this._name;
}
};
}
H = new Human();
H.Name("Donald");
alert(H.Name());
cet exemple est juste (cf. commentaires)
function Human(name){
this._name = name;
this.Name = function(){
if(arguments && arguments.length > 0){//setter
this._name = arguments[0]
return null;
}
return this._name;//getter
};
}
H = new Human();
H.Name("Donald");
alert(H.Name());
@+ P.


Comments
get et set et arguments
Bonjour,
Ne serait-il pas plus judicieux de faire:
this.Name = function(){
if(arguments && arguments.length > 0){
this._name = arguments[0];
}
return this._name;
};
En effet, dans la version que vous proposez, nous ne pouvons même plus affecter une propriété à null, ce qui peut être embêtant.
De plus, lors du setter, vous renvoyez une valeur null, autant renvoyer la valeur courante de la propriété (utile dans un cas comme if(a.Name(getValeur)){ ... } else { ... }) )
Cordialement
Bien vu ! Je vais corriger
Bien vu ! Je vais corriger l'article, comme ça il y a aura la mauvaise méthode, et la bonne (la votre), dans mon cas si on affecte null, on va se retrouver avec un undefined, et en plus le else est inutile. Merci pour la remarque.