Vous aimez ce que vous lisez sur ce blog ?
Envie d'aller plus loin avec véritable formation d'expertise en Java ?
Venez suivre ma formation Masterclasse Expertise Java !

"Même un développeur experimenté a besoin de continuer à apprendre. Et dans cette formation... j'ai appris beaucoup !" - A.G., Java Champion

Sessions intra-entreprises sur demande : contact[at]mokatech.net.
Inscrivez-vous vite !

JavaScript Quiz #4

Vous savez sans doute que l'on peut faire de l'objet avec JavaScript. Mais la syntaxe révèle quelques subtilités, qui sont révélatrices de la manière dont JavaScript implémente l'objet.

C'est ce qui fera l'objet ( ;-) ) de ce quiz JavaScript et des quelques uns qui suivront.

Soit la "classe" Personne, avec deux attributs nom et age et une opération booléenne isMajeur. On peut implémenter ceci comme suit :

  1. function Personne(nom, age) {
  2. this.nom = nom;
  3. this.age = age;
  4. this.isMajeur = Personne_isMajeur;
  5. }
  6.  
  7. function Personne_isMajeur() {
  8. return (this.age >= 18);
  9. }

Gros problème : on peut appeler directement Personne_isMajeur() comme une fonction, au lieu de l'invoquer sur un objet Personne.

Certains vont alors réécrire ce qui précède comme suit :

  1. function Personne(nom, age) {
  2. this.nom = nom;
  3. this.age = age;
  4.  
  5. this.isMajeur = function() {
  6. return (this.age >= 18);
  7. }
  8. }

Mais d'autres auront plutôt tendance à le réécrire comme ceci :

  1. function Personne(nom, age) {
  2. this.nom = nom;
  3. this.age = age;
  4. }
  5.  
  6. Personne.prototype.isMajeur = function() {
  7. return (this.age >= 18);
  8. }

Quelle différence y a-t-il entre ces deux dernières écritures ?

Y a-t-il vraiment une différence ? Pas sûr !

Pour s'en assurer, ajoutons à chacune des définitions de la classe Personne le code suivant :

  1. var jean = new Personne("Jean", 43);
  2. var alex = new Personne("Alex", 21);
  3.  
  4. alert(String(jean.isMajeur) == String(alex.isMajeur));
  5. alert(jean.isMajeur == alex.isMajeur);

Avec la seconde définition de Personne, ce bloc JavaScript supplémentaire affiche true puis true. Avec la première définition, il affiche true puis false. Il y a donc bien une différence !

Qu'affichent vraiment ces deux alertes ?

La première alerte compare le code des opérations isMajeur de jean et alex, puisque convertir en String une fonction permet d'obtenir son code ; la seconde alerte compare la référence vers les opérations isMajeur de jean et alex, comme le ferait une comparaison entre deux objets Java avec l'opérateur ==.

Autrement dit, quelle que soit la manière de définir isMajeur, tous les objets Personne auront une opération isMajeur avec le même code. Par contre, avec la première écriture, une nouvelle opération isMajeur sera définie (et compilée) pour chaque nouvel objet, alors qu'avec la seconde écriture, l'opération isMajeur est définie une fois pour toutes, et commune à tous les objets Personne.

Recréer ou non une nouvelle fonction à chaque création d'instance de la classe, cela fait une sacrée différence de consommation mémoire et de rapidité d'exécution, en effet !


Commentaires

1. Le dimanche 22 février 2009, 22:47 par bhamp0

C'est assez facile quand on connaît Prototype ... sauf qu'il y a plusieurs différences :)

Ajouter un commentaire

Le code HTML est affiché comme du texte et les adresses web sont automatiquement transformées.