Redéfinir les types

Redéfinir un type

Objectif

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.

La singularité du JS "prototype"

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

Exemple

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 ;

}

Méthodes Statiques

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

Redéfinir le type string

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

Méthode isMail()

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.

Méthode matches()

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"

Méthode valueOf()

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

Ce document intitulé « Redéfinir les types » issu de CodeS SourceS (codes-sources.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Rejoignez-nous