Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Atteint de JavaScriptite Aiguë [Cyril Durand]

Expert ASP.net Ajax et WCF, Cyril Durand parle dans son blog de point techniques sur ASP.net, ASP.net Ajax, JavaScript, WCF et .net en général. Cyril est également consultant indépendant, n'hésitez pas à le contacter pour de l'assistance sur vos projets

Actualités

  • Blog de Cyril DURAND, passionné de JavaScript, Ajax, ASP.net et tout ce qui touche au developpement Web Client-Side.

    N'hésitez pas à me contacter pour vos projets .net : architecture, accompagnement, formation, ...

    View Cyril Durand's profile on LinkedIn
    hit counters


    Expertise Commerce server et BizTalk

Javascript : un langage incompris - extension de classe

Je continu ma petite série d'articles pour faire découvrir le magnifique langages qu'est javascript. Cette fois je vais parler de l'extension de classe.

 


L’extension de classe, permet de rajouter des propriétés, functions etc… à une classe déjà définie, n’importe où dans le code.
 
Considérons une classe personne :
    // Classe Personne
    var Personne = function(prenom, nom)
    {
        
        this.prenom = prenom;
        this.nom = nom;
        
        this.toString = function()
        {
            return 'je suis ' + this.prenom + ' ' + this.nom;
        }
    }
Je trouve que dans cette classe il manque la propriété age. Pour la rajouter je peux modifier le code de ma classe mais aussi rajouter ma propriété/méthode à la suite de la classe. Ceci est possible en se servant du prototype de la classe (je reviendrais plus tard sur la notion importante de prototype).
 
Le code devient donc :
    // Classe Personne
    var Personne = function(prenom, nom)
    {
        
        this.prenom = prenom;
        this.nom = nom;
        
        this.toString = function()
        {
            return 'je suis ' + this.prenom + ' ' + this.nom;
        }
    }
    
    // Ajout d’une propriété age ayant pour valeur 0 par défaut.
    Personne.prototype.age = 0;
    
    // Instanciation d'un nouvel objet
    var _Cyril = new Personne('Cyril', 'Durand'); 
    _Cyril.age = 19;
    alert(_Cyril.age);
Ce que j’ai fait avec une propriété, on pourrait tout aussi bien le faire pour des functions, le raisonnement serait le même.
 
Attention : vous ne pouvez pas surcharger une fonction à l’extérieur de la classe. En effet, imaginons que je veuille changer la méthode toString de ma classe, on aurait pu imaginer faire quelque chose comme ca :
    // Classe Personne
    var Personne = function(prenom, nom)
    {
        this.prenom = prenom;
        this.nom = nom;
        
        this.toString = function()
        {
            return 'je suis ' + this.prenom + ' ' + this.nom;
        }
    }
    
    Personne.prototype.age = 0;
    Personne.prototype.toString = function()
    {
        return 'je suis ' + this.prenom + ' ' + this.nom + ' et j\'ai ' + this.age + ' ans';
    }
    // Instanciation d'un nouvel objet
    var _Cyril = new Personne('Cyril', 'Durand'); 
    _Cyril.age = 19;
Cela ne fonctionnera pas ! En fait, le problème se situe au niveau de l’instanciation, quand vous faites votre new Personne, une nouvelle instance de l’objet Personne va être créée. Pour l’instant, l’ordinateur n’est jamais passé par le new, il n’est donc jamais passé par l’intérieur de la classe :
 
        this.prenom = prenom;
        this.nom = nom;
        
        this.toString = function()
        {
            return 'je suis ' + this.prenom + ' ' + this.nom;
        }
 
Par contre, il est déjà passé par les lignes :
 
    Personne.prototype.age = 0;
    Personne.prototype.toString = function()
    {
        return 'je suis ' + this.prenom + ' ' + this.nom + ' et j\'ai ' + this.age + ' ans';
    }
 
La classe Personne, possède donc déjà, une propriété âge et une fonction toString, une fois l’initialisation, il va créer les propriétés prenom et age, mais aussi redéfinir la méthode toString.
 
Pour éviter ce problème, certaines personnes mettent le minimum de chose dans le constructor de la classe, et mettent toutes les fonctions publiques via prototype. C’est une solution pour créer des classes, mais il existe beaucoup de façons de faire, à vous de trouver celle qui vous convient.
 
On peut étendre les classes sur tout les types d’objets, y compris sur les objets de bases fournis par JavaScript. C’est d’ailleurs ce qu’a fait Aurélien sur l’objet string dans sa librairie String.net.

 


Vous pouvez trouver cette article avec les couleurs ici : http://www.cyrildurand.net/divers/articles/javascript/extensionclasse.pdf 

 

Posted: lundi 14 novembre 2005 11:01 par cyril
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :

Commentaires

LocalStone a dit :

Le fameux mot clef prototype ...
J'ai appris la programmation objet avec le Javscript. Et du coup, je croyais naïvement que ce genre de mot clef existait pour n'importe quel langage orienté objet. Que neni ! Y a uniquement une telle chose pour le mot Javascript. C'est l'un des trucs qui manque carrément au C# (entre autre) qui éviterait de dériver des structures pour seulement ajouter une pauvre méthode de rien du tout.
++ !
# novembre 14, 2005 18:27

sebmafate a dit :

c'est pour cela que javascript n'est pas un langage objet... mais un langage de prototypes...
# novembre 14, 2005 19:30

LocalStone a dit :

C'est quoi exactement, un langage prototype ?
# novembre 14, 2005 20:09

Cyril 's Blog a dit :

Je continue dans mes exemples d'utilisation de javascript, vous pouvez retrouvez les autres ici : http://blogs.developpeur.org/cyril/archive/category/1037.aspx...
# novembre 18, 2005 09:04

Cyril 's Blog a dit :

Je continue dans mes exemples d'utilisation de javascript, vous pouvez retrouvez les autres ici : http://blogs.developpeur.org/cyril/archive/category/1037.aspx...
# novembre 18, 2005 09:05

Yohann Olivier a dit :

Il ne faut pas confondre ce que ce cher Certifié Microsoft (bravo, j'aurais pas osé...) nomme "extension" et la notion d'héritage en objet.

Cette fonctionalité Javascript n'a pas un grand intéret, si ce n'est d'éparpiller la déclaration des types n'importe où dans le code... ce qui souligne seulement le fait que le développeur qui l'utilise ne sais pas ce qu'il fait (en tout cas il est incapable de définir rigoureusement les objets qu'il utilise)

Il revient strictement au même de déclarer toutes les propriétés et les "méthodes" d'une classe Javacript une fois pour toute (et de préférence dans un fichier séparé portant le nom de la classe pour profiter au maximum du cache). C'est tout aussi optimisé, et bien plus propre.
# novembre 21, 2005 19:45

Where is my mind ? a dit :

Je n'ai eu jusque l que trs peu l'occasion de travailler avec javascript. Mes seules comptences taient rduite copier en mmoire puis coller au bon endroit dans ma page les bouts de codes ncssaires la tche escompte.


Trs...
# janvier 20, 2006 17:22

Gilles a dit :

Salut je suis tombé sur ce blog en cherchant le moyen d'ajouter des méthode et des propriétés à des objets existants.

on peut ajouter une propriété à un <input id='essai'> en écrivant: getelementById('essai').toto=1;

Ce que je cherche à faire c'est d'ajouter une méthode à tous les <input> d'un formulaire, mais pour utiliser prototype, il faut savoir sur quelle classe l'appliquer.

Savez vous si c'est possible?

# février 13, 2006 15:25

cyril a dit :

@Yohann Olivier (désolé j'ai du zapper un comment :s)
Je suis absolument pas d'accord avec ce que tu dis ! Tu cofonds trop langage prototype et langage objet ... Je peux t'assurer que j'ai eu plein d'occasion de l'utiliser.

Par exemple "l'héritage" ne fait qu'utiliser cette technique, on copie le prototype de l'objet parent vers l'objet fils, puis on rajoute des méthodes à l'objet fils.

Autre cas : la librairie prototype possede un trés grand nombre de classes, vient ensuite la libraire script.aculo.us qui se sert de la librairie prototype. script.aculo.us a rajouté des méthodes trés pratique à certaines classes. Ils auraient pu directement modifié le fichier de prototype, mais en faisant ca si prototype changeait un truc cela aurait été beaucoup plus compliqué à maintenir

et il y a bien d'autres cas d'utilisation



@Gilles

hélas on ne peut pas rajouter des méthodes aux objets Dom :( Ceci vient du faire que IE ne possede pas les objet Node & co par contre Firefox lui possede ces objet ont peut donc utiliser leurs prototypes et étendre ces objets :)

Pour faire cela on peut quand meme faire une bidouille :

var inputs = document.getElementsByTagName('input');
for (var i = 0; i < inputs.length; i++)
inputs[i].toto = 1;

Mais ca reste de la bidouille

PS : les commentaires n'ont pas le meme role qu'un forum à l'avenir merci de poser directement les questions sur un forum dédié ; www.javascriptfr.com par exemple ;)
# février 13, 2006 16:07

Cyril 's Blog a dit :

Je viens de finir d'&#233;crire le 7&#232;me chapitre de ma s&#233;rie : JavaScript : un langage incompris
&amp;nbsp;
J'ai...
# mai 6, 2006 18:42

Cyril 's Blog a dit :

Je viens de finir d'&#233;crire le 7&#232;me chapitre de ma s&#233;rie : JavaScript : un langage incompris
&#160;
J'ai...
# mai 6, 2006 18:46

Cyril 's Blog a dit :

Je viens de finir d'&#233;crire le 7&#232;me chapitre de ma s&#233;rie : JavaScript : un langage incompris
&#160;
J'ai...
# mai 6, 2006 19:46

Cyril 's Blog a dit :

Je viens de finir d'&#233;crire le 7&#232;me chapitre de ma s&#233;rie : JavaScript : un langage incompris
&#160;
J'ai...
# mai 6, 2006 19:48
Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- TechDays Paris 2012 : Comment SharePoint a sauvé mes TechDays par Blog Technique de Romelard Fabrice le il y a 8 heures et 48 minutes

- Perspective 3.0 pour Silverlight 5.0 par Perspective le il y a 10 heures et 9 minutes

- TechDays Paris 2012 : Top 10 des Best Practices pour SQL Server par Blog Technique de Romelard Fabrice le il y a 15 heures et 45 minutes

- TechDays Paris 2012 : Kinect + Office 365 un bon geste pour votre SI par Blog Technique de Romelard Fabrice le il y a 16 heures et 8 minutes

- TechDays Paris 2012 : Pleinière du premier jour par Blog Technique de Romelard Fabrice le il y a 16 heures et 24 minutes

- [SharePoint 2010] Erreur d’analyse de contenu “L’élément SharePoint en cours d’analyse a renvoyé une erreur lors de la demande de données auprès du se... par Julien Chable le il y a 20 heures et 57 minutes

- [TechDays2012] Oui j’y serai! par Blog de Jérémy Jeanson le 02-06-2012, 22:13

- TFS Integration Tools – Suivi des synchronisations avec Reporting Services par Vivien Fabing le 02-05-2012, 17:46

- CSS Content State Selectors (Personnal Draft) par Le blog de FremyCompany le 02-04-2012, 15:38

- MBA : Pourquoi faire et comment le choisir ? par Blog Technique de Romelard Fabrice le 02-03-2012, 14:22