Il peut s'avérer parfois utile de greffer certaines fonctions directement sur les types afin de simplifier le code
par exemple associer une fonction "each" sur les tableau afin d'affecter un traitement à toutes les occurrences du tableau.
Contrairement aux autres langages, le JavaScript autorise de ré-implémenter les classes. Cette singularité est notamment possible grâce au mot clef prototype. Techniquement, prototype va permettre de redéfinir une méthode dite d’instance. Pour redéfinir des méthodes dites statique il suffit de ne pas utiliser prototype
je créé une « classe » personne
function personne(nom,prenom){ this.nom=nom ; this.prenom=prenom ; }
je décide de ré-implémenter ma « classe » en ajoutant une méthode presenter.
personne.prototype.presenter=function(){ return "je m'appel" + this.nom + " " + this.prenom ; }
Je créé une variable statique pour stocker des personnes (collection) puis
je créé une fonction add pour ajouter une personne
personne.collection=new Array() personne.add=function(p){ If(typeof p =="personne"){ Personne.collection.push(p) ; } }
exemple d'utilisation
var p1=new personne("DUPONT","Pierre"); var p2=new personne("DUPOND","Jean"); personne.add(p1); personnne.add(p2); for(i=0;i<personne.collection.length;i++){ personne.collection[i].presenter(); }
le code retournera
je m'appel DUPONT Pierre
je m'appel DUPONTJean
Dans ce tutoriel nous allons ré-implémenter le type String en greffant 3 nouvelles méthodes
- La première nous permettra de déterminer si la chaîne de caractère correspond à un mail,
- la seconde déterminera si la chaîne correspond à un pattern précis si oui retournera le tableau des éléments qui y correspond
- la dernière si elle apparaît au moins une fois dans un tableau.
On peut greffer nos trois fonctions en utilisant le mot clef prototype directement associé à la classe
prototype.isMail=function(){ var reg=new RegExp(“^(\{1,12})@([a-z * {1,15}\.([a-z]{1,3})$”, “ i”) ; return reg.test(this) ; }
si je teste
console.log([mailto:monmail@voila.fr monmail@voila.fr]".isMail());
j'aurais en retour true;
si je teste
console.log(monmail@bobi".isMail());
j'aurais en retour false.
prototype.getMatch=function(reg){ //définir le type de reg Switch(typeof reg){ Case "string" : { //la variable reg est une chaîne de caractère, //nous allons créer un nouveau RegExp var r=new RegExp(reg, [" i" * ) ; return r.exec(this)//on retourne le tableau break ; } Case "object" : { //la variable reg est un objet (donc une RegExp) If(reg.exec)//On test si l'objet possède notre méthode return reg.exec(this) ; //on retourne le tableau else throw "not a regexp" break ; } } }
Si je test
console.dir("mon nom est DUPONT".matches("mon nom est ((?:[a-z * [a-z0-9_]*))") ; console.dir("mon nom est DUPONT".matches(new RegExp("mon nom est ((?:[a-z * [a-z0-9_]*))",["i" ])) ;
J'afficherai
0 | "mon nom est DUPONT" |
1 | DUPONT |
index | 0 |
input | "mon nom est DUPONT" |
prototype.valueOf=function(a){ var b=false ; var i=0 ; while(i){ if(a[i] == this){ b=true ; } else{ i++ ; } } return b ; }
Si je test
console.log("banane".valueOf(["Framboise","banane","Fraise","kiwi"] ) ;
J'afficherai
true