CodeS-SourceS
Rechercher un code, un tuto, une réponse

Redéfinir les types

Avril 2017


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"
1DUPONT
index0
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

A voir également

Publié par CecilCordheley.
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.
Ajouter un commentaire

Commentaires

Donnez votre avis
Affichage aleatoire d'une image et rafraichissement automatique javascript et jquery
Associer un événement