Les Hash de Prototype 1.6

27 décembre 2008 par: Benoit Bonneville

Ne pas confondre Hash et Objet Javascript. Prototype propose une classe Hash (raccourcit : $h ou dollards h) qui permet de gérer des paires de (clefs, valeurs).
Mais attention depuis la version 1.6 cette version à changée.

Les Objets Javascript

Quand vous déclarez un objet en JavaScript, vous pouvez le faire en lui ajoutant des propriétés comme ceci :

var mon_objet = {propriete: 'valeur',propriete2:'valeur2'}

Après cette déclaration vous pourrez:
lire une valeur

alert(mon_objet.propriete);

Modifier une valeur

mon_objet.propriete = 'nouvelle valeur';

Ajouter une valeur

mon_objet.propriete3 = 'valeur3';

Les Objets Hash de prototype

Ces objets sont intelligent et proposent beaucoup plus de fonctionnalités que les Objets JavaScript.
Pour creer un objet Hash vous devrez faire :

var mon_hash = new Hash({propriete: 'valeur',propriete2:'valeur2'});
// ou
var mon_hash = $H({propriete: 'valeur',propriete2:'valeur2'});

$H est un alias de la classe H.
Cet objet possède alors des méthodes tels que :
Mettre à jour une clé :

mon_hash.set('propriete ','nouvelle valeur');

Récuperer une clé:

mon_hash.get('propriete ');

L’ensemble des méthodes disponible sont accecible sur l’API prototype

Problème de rétro compatibilité des arguments.

Attention, beaucoup de méthodes de Prototype demandent une liste d’arguments sous forme de Hash.
Depuis la mise à jour de Prototype 1.6 les 2 hash sont bien distinct et donc cela pose des problèmes de rétro compatibilités avec les versions antérieurs.
Prennons l’explemple de :

element.setStyle(styles);

Cette fonction permet d’appliquer les styles css à element.
Avant Prototype 1.6 vous pouviez utilisez ceci :

var styles = $H({color:'red');

Maintenant avec prototype 1.6 vous devez faire cela :

var styles = {color:'red'}

Pourquoi cela ?
Parce que le parcours des éléments des arguments ce fait par la méthode d’introspection javascript :

for (var property in styles)

Alors qu’il faudrait un parcours utilisant la méthode each(); de l’objet Hash.

La version de Hash utilisé dans les version 1.5 et inférieur était capable de supporter cette introspection et donc pouvait servir d’arguments de méthode.

Conclusion et Solution

Le nouvel objet Hash de prototype est dans une optique d’une meilleur manipulation de données Objet ce qui n’est pas un mal.
Mais les arguments des méthodes prototype ne restent accessible qu’aux objets Javascript.
La solution est donc d’utiliser la méthode Hash.toObject(); qui vous génère un objet javascript avec comme attributs, les paires de (clé,valeurs) de l’objet Hash.
Exemple :

var styles = new Hash({color:'red');
styles.set('display','block');
element.setStyle(styles.toObject());

Vous avez donc l’avantage des Hash et la compatibilité avec toutes les fonctions Prototype existante, et des autres Framework éventuel, comme Scriptacoulus pour ne pas le nommer)

Attention cette fonction magique ne permet pas forcement de passer d’un script conçu pour prototype 1.5 a prototype 1.6, car certaines fonctions ont changé de fonctionnement interne.
Exemple: hash_source.merge(hash_new) maintenant génère un nouvel objet Hash, et ne modifie plus l’objet existant.

Filed under: Non classé

Répondre