Surcharge de méthodes en JavaScript
Il est très difficile d'écrire du code "orienté objet" en JavaScript pur car celui ci n'est pas prévu pour ça, mais on peut tout à fait coder des fonctions qui nous permettent d'utiliser l'héritage et beaucoup d'autres choses, d'ailleurs Derf à écrit un très bon article la dessus : JavaScript & La POO. Microsoft Ajax Library ("Atlas") possède de nombreuses fonctionnalités permettant à JavaScript de devenir orienté Objet. Après avoir parcouru les différents fichiers JavaScript d'Atlas je me suis aperçu qu'une chose manquait : la surcharge des méthodes c'est à dire la possibilité d'écrire plusieurs méthodes en ayant seulement la signature qui change.
On peut tout à fait le faire avec Atlas mais il n'existe pas de convention d'écriture à ce jour, voici celle que j'ai choisis :
toString : function(){
if (arguments.length == 1 && Object.getType(arguments[0]) == String){
return this.toString$String.apply(this, arguments);
} else if (arguments.length == 2 && Object.getType(arguments[0]) == String && Object.getType(arguments[1]) == Sample.Person){
return this.toString$String$Person.apply(this, arguments);
} else {
return this.toString$.apply(this, arguments);
}
},
toString$ : function(){
return String.format('je suis {0} {1}', this.get_firstName(), this.get_lastName());
},
toString$String : function(format){
return String.format(format, this.get_firstName(), this.get_lastName());
},
toString$String$Person : function(format, person){
return String.format('{0} , {1}', this.toString(format), person.toString(format));
}
Le code ne nécessite pas d'explication, il est relativement simple si on a quelques notions de JavaScript avec Atlas. L'exemple ci-dessous utilise cette surcharge :
window.pageLoad = function(){
var p = new Sample.Person('Cyril', 'Durand');
alert(p.toString());
alert(p.toString('{0} {1}'));
var p2 = new Sample.Person('Toto', 'Bidule');
alert(p.toString('{0} {1}', p2));
}
Je pense qu'il serait bien que cette fonctionnalité soit intégré dans Orcas, qu'en pensez vous ? quelqu'un sait il où on peut mettre nos idées en ce qui concerne Visual Studio "Orcas" ? (par défaut j'ai fait la requête sur le forum www.asp.net)
Pour info, voici le code de ma classe au complet :
// Création d'un namespace
Type.registerNamespace('Sample');
// Constructeur de la class Personne
Sample.Person = function(firstName, lastName){
this._firstName = firstName;
this._lastName = lastName;
}
// Rajout des différentes méthodes à notre type
Sample.Person.prototype = {
get_firstName : function(){
return this._firstName;
},
set_firstName : function(value){
this._firstName = value;
},
get_lastName : function(){
return this._lastName;
},
set_lastName : function(value){
this._lastName = value;
},
toString : function(){
if (arguments.length == 1 && Object.getType(arguments[0]) == String){
return this.toString$String.apply(this, arguments);
} else if (arguments.length == 2 && Object.getType(arguments[0]) == String && Object.getType(arguments[1]) == Sample.Person){
return this.toString$String$Person.apply(this, arguments);
} else {
return this.toString$.apply(this, arguments);
}
},
toString$ : function(){
return String.format('je suis {0} {1}', this.get_firstName(), this.get_lastName());
},
toString$String : function(format){
return String.format(format, this.get_firstName(), this.get_lastName());
},
toString$String$Person : function(format, person){
return String.format('{0} , {1}', this.toString(format), person.toString(format));
}
}
// Enregistrement de notre type dans le framework Atlas
Sample.Person.registerClass('Sample.Person');