Modifier le contexte d'une méthode

Parent Previous Next



Modifier le contexte d'une méthode



Pour finir ce chapitre, nous allons ici aborder un sujet assez avancé : la modification du contexte d'une méthode. Dans l'immédiat, cela ne signifie sûrement rien pour vous, nous allons donc expliquer le concept. Commençons par un petit rappel. Connaissez-vous la différence entre une fonction et une méthode ?


La première est indépendante et ne fait partie d'aucun objet (ou presque, n'oublions pas window). La fonction alert() est dans cette catégorie, car vous pouvez l'appeler sans la faire précéder du nom d'un objet :

alert('Test !'); // Aucun objet nécessaire !


Une méthode, en revanche, est dépendante d'un objet. C'est le cas par exemple de la méthode push() qui est dépendante de l'objet Array. Le fait qu'elle soit dépendante est à la fois un avantage et un inconvénient :


Cet inconvénient peut être résolu grâce à deux méthodes nommées apply() et call().


Comme vous le savez, une méthode utilise généralement le mot-clé this pour savoir à quel objet elle appartient, c'est ce qui fait qu'elle est dépendante. Les deux méthodes apply() et call() existent pour permettre de rediriger la référence du mot-clé this vers un autre objet !


Nous n'allons pas faire de cas pratique avec la méthode push(), car son fonctionnement est spécifique aux tableaux (il serait difficile de lui demander d'ajouter une donnée sur un objet dont la structure est totalement différente). En revanche, il existe une méthode que tout objet possède : toString() ! Cette méthode a pour but de fournir une représentation d'un objet sous forme de chaîne de caractères, c'est elle qui est appelée par la fonction alert() lorsque vous lui passez un objet en paramètre. Elle possède


cependant un fonctionnement différent selon l'objet sur lequel elle est utilisée :

alert(['test']); // Affiche : « test »

alert({0:'test'}); // Affiche : « [object Object] »


Nous n'avons pas fait appel à la méthode toString(), mais, comme nous l'avons dit précédemment, alert() le fait implicitement.


Comme vous avez pu le constater, la méthode toString() renvoie un résultat radicalement différent selon l'objet. Dans le cas d'un tableau, elle retourne son contenu, mais quand il s'agit d'un objet, elle retourne son type converti en chaîne de caractères.


Notre objectif maintenant va être de faire en sorte d'appliquer la méthode toString() de l'objet Objectsur un objet Array, et ce afin d'obtenir sous forme de chaîne de caractères le type de notre tableau au lieu d'obtenir son contenu.


C'est là qu'entrent en jeu nos deux méthodes apply() et call(). Elles vont nous permettre de redéfinir le mot-clé this de la méthode toString(). Ces deux méthodes fonctionnent quasiment de la même manière, elles prennent toutes les deux en paramètre un premier argument obligatoire qui est l'objet vers lequel va pointer le mot-clé this. Nos deux méthodes se différencient sur les arguments facultatifs, mais nous en reparlerons plus tard. En attendant, nous allons nous servir de la méthode call().


Comment utiliser notre méthode call() ? Tout simplement de la manière suivante :

methode_a_modifier.call(objet_a_definir);


Dans notre exemple actuel, la méthode à modifier est toString() de l'objet Object. En sachant cela il ne nous reste plus qu'à faire ceci :

var result = Object.prototype.toString.call(['test']);

 

alert(result); // Affiche : « [object Array] »


Nous y voilà ! La méthode toString() de Object a bien été appliquée à notre tableau, nous obtenons donc son type et non pas son contenu.


Revenons maintenant sur les arguments facultatifs de nos deux méthodes apply() et call(). La première prend en paramètre facultatif un tableau de valeurs, tandis que la deuxième prend une infinité de valeurs en paramètres. Ces arguments facultatifs servent à la même chose : ils seront passés en paramètres à la méthode souhaitée.


Ainsi, si nous écrivons :

var myArray = [];

 

myArray.push.apply(myArray, [1, 2, 3]);


Cela revient au même que si nous avions écrit :

var myArray = [];

 

myArray.push(1, 2, 3);


De même, si nous écrivons :

var myArray = [];

 

myArray.push.call(myArray, 1, 2, 3);


Cela revient à écrire :

var myArray = [];

 

myArray.push(1, 2, 3);


Voilà pour ces deux méthodes ! Leurs cas d'application sont assez rares, mais sachez au moins qu'elles existent, nous y aurons sûrement recours plus tard dans ce tutoriel.


En résumé



Créé avec HelpNDoc Personal Edition: Créer des sites web d'aide facilement

Site à deux balles