Précédent   Forum des professionnels en informatique > Webmasters - Développement Web > JavaScript
JavaScript Forum programmation JavaScript. Lire : Cours JavaScript, FAQ JavaScript, Toutes les FAQ JavaScript et Sources JavaScript
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 31/08/2011, 09h25   #1
Membre confirmé
 
Homme gwendal toullec
Développeur informatique
Inscription : juillet 2009
Messages : 136
Détails du profil
Informations personnelles :
Nom : Homme gwendal toullec
Âge : 31
Localisation : France, Seine Maritime (Haute Normandie)

Informations professionnelles :
Activité : Développeur informatique
Secteur : Enseignement

Informations forums :
Inscription : juillet 2009
Messages : 136
Points : 224
Points : 224
Par défaut javascript orienté objet: bonne pratique et héritage

Bonjour à tous, je suis actuellement le tuto de Thierry Templier sur la POO en javascript et j'ai une question concernant la partie 2. Ayant besoin de mettre en pratique une "objectisation" de gros code JS je voulais créer des classes héritées pour factoriser du code redondant. J'en suis donc arrivé à retenir la dernière solution proposée avant la partie héritage multiple à savoir:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
 
function MaClasseMere(parametre1, parametre2) { 
    this.attribut1 = parametre1; 
    this.attribut2 = parametre2; 
} 
 
MaClasseMere.prototype = { 
    methode: function() { 
        alert("[methode] Attributs: " + this.attribut1 + ", " + this.attribut2); 
    } 
} 
 
function MaClasse(parametre1, parametre2, parametre3) { 
    MaClasseMere.call(this, parametre1, parametre2); 
    this.attribut3 = parametre3; 
} 
 
MaClasse.prototype = { 
    uneMethode: function() { 
        alert("[uneMethode] Attributs: " + this.attribut1 
                       + ", " + this.attribut2 + ", " + this.attribut3); 
    } 
}; 
 
heriter(MaClasse.prototype, MaClasseMere.prototype); 
var obj = new MaClasse("parametre1", "parametre2", "parametre3"); 
obj.methode(); 
...
seulement voilà, j'ai peur qu'en faisant ainsi les méthodes de la classes mère écrasent les méthodes du même nom de la classe fille rendant par la même les surcharges des méthodes de la classe fille inopérantes. Serait-il plus opportun d’affecter en premier l'héritage comme ceci:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
function MaClasse(parametre1, parametre2, parametre3) { 
    MaClasseMere.call(this, parametre1, parametre2); 
    this.attribut3 = parametre3; 
} 
 
heriter(MaClasse.prototype, MaClasseMere.prototype); 
 
MaClasse.prototype = { 
    uneMethode: function() { 
        alert("[uneMethode] Attributs: " + this.attribut1 
                       + ", " + this.attribut2 + ", " + this.attribut3); 
    } 
};
Merci pour votre aide !
negstek est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 31/08/2011, 10h18   #2
Expert Confirmé
 
Avatar de sekaijin
 
Femme
Urbaniste
Inscription : juillet 2004
Messages : 1 421
Détails du profil
Informations personnelles :
Sexe : Femme
Âge : 48
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Urbaniste
Secteur : Santé

Informations forums :
Inscription : juillet 2004
Messages : 1 421
Points : 2 809
Points : 2 809
La bonne pratique est d'utiliser la POO de JS telle que le langage la définit c'est à dire un POO à base de prototype
et non à base de classe

lire donc
http://fr.wikipedia.org/wiki/Program...%A9e_prototype
mieux
http://en.wikipedia.org/wiki/Prototy...ed_programming

et pour en saisir les avantages un peu de théorie ne fait pas de mal
http://fr.wikipedia.org/wiki/Th%C3%A9orie_du_prototype

si tu veux donc de bonne pratique ne définit pas de classe

reproduire la poo à base de classes avec un langage à prototype
c'est possible ça fonctionne

ça n'apporte rien

n'utiliser que la POO à base de classe créé réduit considérablement les capacité du langage
et ce qui serait fait de façon simple avec le langage devient compliqué à réalisé avec les classes

un exemple simple javascript connait la notion d'objet nativement
java ne connait que la notion d'instance d'une classe

pour obtenir un singleton avec java il faut définir une classe qui contient un membre statique privé un créateur privé et une methode factory puis il faut appeler la méthode factory pour que l'objet existe
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class mySingleton {
   static private mySingleton  member;
 
   static private mySingleton () {
     ...
   }
 
 
   static mySingleton  factory() {
      if (null == member)
           member = new mySingleton ();
      return member;
   }
 
   // ici enfin le code utile à l'objet singleton
}
monObjet = mySingleton.factory();
Il faut donc les notions private, static, factory, constructor, et instance

en javascript et en langage à prototype
Code :
1
2
3
monObjet = {
   // ici simplement le code utile à l'objet singleton
}

l'héritage d'objet est beaucoup plus puissant que l'héritage de classe.
A+JYT
sekaijin est déconnecté   Envoyer un message privé Réponse avec citation 40
Vieux 31/08/2011, 11h44   #3
Expert Confirmé Sénior
 
Avatar de RomainVALERI
 
Homme Romain VALERI
POOête
Inscription : avril 2008
Messages : 2 573
Détails du profil
Informations personnelles :
Nom : Homme Romain VALERI
Âge : 35
Localisation : France, Meurthe et Moselle (Lorraine)

Informations professionnelles :
Activité : POOête

Informations forums :
Inscription : avril 2008
Messages : 2 573
Points : 4 075
Points : 4 075
Citation:
Envoyé par sekaijin Voir le message
La bonne pratique est d'utiliser la POO de JS telle que le langage la définit c'est à dire un POO à base de prototype
et non à base de classe [...]
+1 avec l'ensemble de l'intervention ^^

>>> Pour visser quelque chose, un couteau cassé et limé ne fera jamais un aussi boulot qu'un tournevis (heu... je ne suis pas sur qu'elle soit d'une grande clarté cette métaphore bref tenons-nous en aux excellentes explications du camarade sekaijin )
__________________

...pour les linguistes et les curieux >>> générateur de phrases aléatoires

__________________
RomainVALERI est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/08/2011, 11h48   #4
Membre confirmé
 
Homme gwendal toullec
Développeur informatique
Inscription : juillet 2009
Messages : 136
Détails du profil
Informations personnelles :
Nom : Homme gwendal toullec
Âge : 31
Localisation : France, Seine Maritime (Haute Normandie)

Informations professionnelles :
Activité : Développeur informatique
Secteur : Enseignement

Informations forums :
Inscription : juillet 2009
Messages : 136
Points : 224
Points : 224
merci pour les liens intéressants !
cependant tu es passé à coté de ma question. Quand tu dis :
Citation:
Envoyé par sekaijin Voir le message
La bonne pratique est d'utiliser la POO de JS telle que le langage la définit c'est à dire un POO à base de prototype
et non à base de classe

...

reproduire la poo à base de classes avec un langage à prototype
c'est possible ça fonctionne

ça n'apporte rien

...

l'héritage d'objet est beaucoup plus puissant que l'héritage de classe.
A+JYT
je pense qu'une connaissance (ou une lecture) des tutoriels cités de Mr t.Templier s'imposait (j'avais mis un lien). En effet nul part dans le code cité on ne trouve de
L'auteur des tutos utilise la notation "maClasse" pour faciliter l'association d'idées mais je pense que ce sont des objets hérités par prototypage qui sont utilisés. Ce qui nous placerais déjà dans le contexte des bonnes pratiques que tu défends. Cependant un grand merci pour ta réponse qui aura eu l'avantage de me faire potasser encore un peu

Ma question je le rappelle est assez concise :

est-ce que je peux me permettre d’appeler la fonction hériter (cf: tuto) avant de créer par prototype les méthodes de la "classe" (ou objet) fille ou non?
negstek est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 31/08/2011, 11h55   #5
Membre à l'essai

 
Inscription : juin 2007
Messages : 11
Détails du profil
Informations personnelles :
Âge : 36

Informations forums :
Inscription : juin 2007
Messages : 11
Points : 23
Points : 23
Bonjour,

Si tu réinitialises le prototype (MaClasse.prototype = { ...) après avoir appelé la fonction d'héritage, tu vas perdre tout ce que tu as copié sur ce prototype.

Il faut que tu t'arranges pour initialiser le prototype dans le bon ordre avec ce que tu veux mettre dedans

@sekaijin: je suis bien d'accord avec toi que JavaScript fonctionne de manière complètement différente de Java (ou des langages à base de classe). Concernant les instances uniques, il est clair qu'il n'est pas nécessaire d'utiliser des "classes" pour créer les instances. Par contre, quand tu as potentiellement plusieurs instances sur le même "moule", il est important d'utiliser une approche où l'instance est créée à partir du prototype. Sinon tu auras autant d'instanciation de méthodes d'objets que d'objets. Ce n'est pas le cas avec les prototypes où ces méthodes sont partagées.

Il est également à noter que JavaScript offre la méthode Object.create qui permet d'instancier un objet à partir d'un "moule" (ce moule peut-être vu comme une classe). Cette méthode ne fait pas autre chose que d'affecter le "moule" sur le prototype de l'objet:

Code :
1
2
3
4
5
Object.create = function (o) {
    function F() {}
    F.prototype = o;
    return new F();
};
En espérant t'avoir aidé,
Thierry
templth est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 31/08/2011, 11h58   #6
Membre à l'essai

 
Inscription : juin 2007
Messages : 11
Détails du profil
Informations personnelles :
Âge : 36

Informations forums :
Inscription : juin 2007
Messages : 11
Points : 23
Points : 23
Citation:
L'auteur des tutos utilise la notation "maClasse" pour faciliter l'association d'idées mais je pense que ce sont des objets hérités par prototypage qui sont utilisés.
Oui, c'était exactement çà mais j'aime bien les critiques autour de ces tutoriels
templth est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 31/08/2011, 11h58   #7
Expert Confirmé Sénior
 
Avatar de RomainVALERI
 
Homme Romain VALERI
POOête
Inscription : avril 2008
Messages : 2 573
Détails du profil
Informations personnelles :
Nom : Homme Romain VALERI
Âge : 35
Localisation : France, Meurthe et Moselle (Lorraine)

Informations professionnelles :
Activité : POOête

Informations forums :
Inscription : avril 2008
Messages : 2 573
Points : 4 075
Points : 4 075
Je ne veux pas dénigrer le travail des petits camarades (donc pardon d'avance thierry ! ), mais en l'occurrence je me demande s'il est pertinent, alors que justement de nombreuses confusions sont possibles (entre les deux paradigmes de programmation que sont la programmation objet par classe et la programmation objet par prototypage), d'utiliser un vocabulaire aussi "trompeur"...
__________________

...pour les linguistes et les curieux >>> générateur de phrases aléatoires

__________________
RomainVALERI est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/08/2011, 12h15   #8
Membre confirmé
 
Homme gwendal toullec
Développeur informatique
Inscription : juillet 2009
Messages : 136
Détails du profil
Informations personnelles :
Nom : Homme gwendal toullec
Âge : 31
Localisation : France, Seine Maritime (Haute Normandie)

Informations professionnelles :
Activité : Développeur informatique
Secteur : Enseignement

Informations forums :
Inscription : juillet 2009
Messages : 136
Points : 224
Points : 224
Par défaut on y est presque...

Citation:
Envoyé par templth Voir le message
Bonjour,
Si tu réinitialises le prototype (MaClasse.prototype = { ...) après avoir appelé la fonction d'héritage, tu vas perdre tout ce que tu as copié sur ce prototype.
bah en fait c'était dans le cas ou j'avais une méthode de la classe fille portant le même nom qu'un méthode de la classe mère que je voulais overrider. Dans ce cas je ne perds pas d'autres informations que celles liées à la méthodes à surcharger, si ?
negstek est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 31/08/2011, 18h10   #9
Membre à l'essai

 
Inscription : juin 2007
Messages : 11
Détails du profil
Informations personnelles :
Âge : 36

Informations forums :
Inscription : juin 2007
Messages : 11
Points : 23
Points : 23
@Romain: pas de souci! Je suis content d'avoir ton point de vue à ce niveau!

@Gwendal: oui tu perds uniquement la méthode de la classe mère car elle est "remplacée" par celle de la classe fille.

Thierry
templth est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 31/08/2011, 19h27   #10
Membre confirmé
 
Homme gwendal toullec
Développeur informatique
Inscription : juillet 2009
Messages : 136
Détails du profil
Informations personnelles :
Nom : Homme gwendal toullec
Âge : 31
Localisation : France, Seine Maritime (Haute Normandie)

Informations professionnelles :
Activité : Développeur informatique
Secteur : Enseignement

Informations forums :
Inscription : juillet 2009
Messages : 136
Points : 224
Points : 224
Citation:
Envoyé par templth Voir le message
oui tu perds uniquement la méthode de la classe mère car elle est "remplacée" par celle de la classe fille.
Ok thierry, merci pour ton complément d'informations. J'espère que tu nous pondra d'autres tuto aux sujets aussi pertinents. Je fais aussi du JAVA et j'attends le weekend avec impatience pour avoir un peu de tps pour moi et lire ton intro à la technologie OSGI, cette technologie m'intrigue depuis que j'ai vu les plug's dans eclipse, c'est l'occasion ou jamais de s'instruire...

au plaisir de te lire.

++
negstek est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 21h33.


 
 
 
 
Partenaires

Hébergement Web