|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Invité de passage
![]() Inscription : novembre 2010 Messages : 10 ![]() |
Bonjour,
je reprends le javascript après avoir longuement codé assez salement, je voudrais reprendre sur de bonnes bases. Après avoir cherché sur le net je voulais savoir si j'avais bien compris certaines choses : Code :
classe.f = 3; ->attribut statique/publique classe.prototype.g=4; ->publique , ajouté à la classe et toutes les instances existantes ou non Code :
classe.prototype.h = function(){}; -> publique ------ qlqs questions : 1) est ce qu'il y a un meilleur moyen (plus propre) pour qu'une instance puisse atteindre le champ statique de sa classe que : classe.champStatic ? 2) prototype est une super classe qui est vérifié lorsqu'un champ ou une méthode n'est pas trouvé dans la classe, mais je ne vois pas l’intérêt autre que de permettre d'ajouter un champ ou une méthode dynamiquement à une classe et ses instances. est ce que peut être le prototype d'une classe n'existe qu'une fois et une méthode qui n'existe pas dans un objet est cherché dans le prototype de la classe et donc là oui, on gagne en mémoire puisque non recopié dans chaque instance ? donc dans ce cas pourquoi ne pas tout mettre dans prototype ? 3) qu'elle est la différence entre : et à part que la 2eme est une fonction anonyme et les 2 privées ? merci pour les réponses j'espère ne pas avoir dit trop de stupidités |
||
|
|
00
|
|
|
#2 |
![]() ![]() Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Analyste Programmeur Inscription : mars 2002 Messages : 30 007 ![]() |
as tu vu ce post ?
http://www.developpez.net/forums/d23...oo-javascript/
__________________
Ma page Developpez Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts) Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir... Votre post est résolu ? Alors n'oubliez pas le Tag ![]() ![]() réalisations :www.planet-languages.com|www.saftair.com| www.ouestisol.fr | www.sebemex.fr | www.extramiante.fr | www.sistac-alizay.fr | www.acoustishop.fr | www.litt.fr | www.ouestventil.fr |
|
|
00
|
|
|
#3 |
|
Invité de passage
![]() Inscription : novembre 2010 Messages : 10 ![]() |
et bien oui j'ai vu, mais ça ne répond pas totalement à mes questions :/
|
|
|
00
|
|
|
#4 | |
|
Expert Confirmé Sénior
![]() Romain VALERIPOOête Inscription : avril 2008 Messages : 2 572 ![]() |
Citation:
Tu as utilisé 13 fois le mot "classe" dans ton post initial... Or.... les classes n'existent pas en JS. Tu peux réécrire ton post sans employer ce mot pour voir ? (ce que je veux dire, c'est que tant que tu essaieras de retrouver en JS des concepts qui lui sont étrangers parce que tu es plus à l'aise avec, tu vas t'arracher les cheveux... Profite de la vie, allez )
__________________
...pour les linguistes et les curieux >>> générateur de phrases aléatoires __________________ |
|
|
|
00
|
|
|
#5 |
|
Invité de passage
![]() Inscription : novembre 2010 Messages : 10 ![]() |
je le sais, c'est une façon de formaliser
|
|
|
00
|
|
|
#6 |
![]() ![]() Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Analyste Programmeur Inscription : mars 2002 Messages : 30 007 ![]() |
voici ou j'en étais resté sur la POO en js
http://www.developpez.net/forums/d96...avascript-poo/
__________________
Ma page Developpez Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts) Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir... Votre post est résolu ? Alors n'oubliez pas le Tag ![]() ![]() réalisations :www.planet-languages.com|www.saftair.com| www.ouestisol.fr | www.sebemex.fr | www.extramiante.fr | www.sistac-alizay.fr | www.acoustishop.fr | www.litt.fr | www.ouestventil.fr |
|
|
00
|
|
|
#7 | |||||||||||||||||||||||||||||
|
Membre Expert
![]() Boris Dessysans emploi Inscription : décembre 2010 Messages : 853 ![]() |
Citation:
)classe.f = 3; ->attribut statique/publique var classeObject = new classe(); classeObject.f = 3; -> classe étant le nom de ta fonction (constructeur), classe.f rajoute un champ f à l'objet qu'est la fonction et non pas aux instances de cette fonction (constructeur). autrement classeObject.f rajoute/modifie le champ f de ton instance pour l'objet courant donné ! donc ne pas le définir dans le constructeur te permet de n'avoir un champ f que dans une seule de tes nombreuses instances par exemple. (sinon en général, il n'y a pas de "bonne" ou de "mauvaises" pratiques dans la conception de tes objets je dirai ...). 1) avec ce que je dis juste ici au dessus, je ne suis pas sûr que la notion de statique soit à proprement parlé la bonne ici. ce que tu considères comme statique n'est qu'un champ "normal" de ton objet[fonction] 2) prototype ne rajoute pas des champs s'ils ne sont pas trouvé ! ça rajoute des champs par défauts à ton objets tout simplement. ça ne rajoute pas des champs à une classe et ses instances mais uniquement aux instances de classe. le prototype n'existe effectivement qu'une fois à la base. il n'est pas "recherché" si la méthode n'existe pas dans l'objet. il est la méthode de l'objet par défaut. méthode de l'objet qui peut être remplacée par une autre par la suite. dans le cas d'une méthode : Code js :
cette différence étant évidement "bidon", puisque l'équivalent de la classe2 serait simplement : Code js :
en général les gens utiliseront surtout le prototype pour "éclaircir" le constructeur en mettant toutes les "définitions" en dehors de celui-ci. le constructeur ne contenant plus qu'une éventuelle "exécution" de code. Code :
Code :
sinon pour revenir à la déclaration de fonctions (dupliquées) dans une "classe", cela à pour avantage d'avoir accès aux variables privées d'une "classe". par exemple : Code :
Code :
Code :
on peut créer 2 classes avec le même prototype : Code :
attention toutefois, le prototype des 2 classes étant ici un objet unique, si tu modifies celui d'une des 2 classes, tu modifies les 2. par exemple : Code js :
d'ailleurs fait aussi attention avec les prototype contenant des objets car comme pour les méthodes, il n'y en aura qu'un en mémoire. Code :
Code js :
3) la différence entre var a = function(){} et function a(){} est déjà que dans certains navigateurs (chrome et firefox mais pas IE) il existe l'attribut "name" aux fonctions, donc tu pourras avoir : Code :
Code :
edit: il y a surement des erreurs(ou au moins de précision à apporter) dans(à) ce que je dis, je laisse mes collègues me corriger. |
|||||||||||||||||||||||||||||
|
|
00
|
|
|
#8 |
![]() ![]() Inscription : janvier 2011 Messages : 2 933 ![]() |
je ne saurais te recommander également, si cela n'est déjà fait, les cours sur la Programmation objet, sur ce site même que j'ai trouvé bien fait...
|
|
|
00
|
|
|
#9 |
|
Invité de passage
![]() Inscription : novembre 2010 Messages : 10 ![]() |
merci beaucoup pour tes réponses, qui sont exactement celle que je recherchais
![]() j'ai eu beau lire, mais souvent les articles sont incomplets etc... merci en tout cas ps : j'ai pas vu les articles sur la poo |
|
|
00
|
|
|
#10 |
|
Membre Expert
![]() Boris Dessysans emploi Inscription : décembre 2010 Messages : 853 ![]() |
en voulant tester s'il n'y avait pas de différence de temps pour :
et étant donné que le premier exécute en fait 2 instructions (une déclaration de fonction anonyme + une asignation) ma curiosité m'a démontre que non, le temps d'éxecution sont vraiment égaux(ou différence suffisament insignifiante) mais par contre en faisant mes tests j'ai remarqué que chrome était 6 fois plus lent que ie ou firefox pour executer une boucle de déclaration de fonctions.... je suis choqué ! moi qui vénérait chrome |
|
|
00
|
|
|
#11 | |||||
|
Membre Expert
![]() Boris Dessysans emploi Inscription : décembre 2010 Messages : 853 ![]() |
Citation:
par rapport à la code suivant dure : --------------------- Code :
a = function(){}// avec var a déclaré préalablement chrome : 25x plus lent ie : 35x plus lent --------------------- Code :
var a = function(){}// avec var a déclaré préalablement ou non chrome : 25x plus lent ie : 35x plus lent --------------------- Code :
window.a = function(){}// avec var a déclaré préalablement chrome : 95x plus lent ie : 35x plus lent --------------------- Code :
window.a = function(){}// avec var a non déclaré préalablement chrome : 95x plus lent ie : 130x plus lent --------------------- testé avec le code suivant : Code js :
donc j'aurai tendance à généraliser que est plus rapide qu'une assignation de fonction anonyme (dans la majorité des cas) mais je maintiens que la principale différence des 2 sera principalement au niveau de la lisibilité. par exemple ceux habitués à utiliser des objets (genre json etc..) auront pour habitude de faire leurs déclaration ainsi : Code :
oui, je m'emmerde vraiment pour écrire tout ça. |
|||||
|
|
10
|
|
|
#12 |
|
Membre Expert
![]() Tlouye Ci Inscription : mars 2004 Messages : 1 450 ![]() |
En tout cas ce serait peut-être pas mal de le rajouter à la FAQ (si ça n'y est pas déjà, j'ai pas regardé
Merci à guive et aux participants pour ce post somme toute intéressant. |
|
|
00
|
|
|
#13 |
|
Expert Confirmé
![]() ![]() Urbaniste Inscription : juillet 2004 Messages : 1 419 ![]() |
encore une fois je vais dire
"arrêtez de penser classe" vouloir reproduire un système de classes avec un langage à prototype c'est perdre des capacités du langage Un langage à base de classe ne permet que la surcharge de classe alors qu'un langage à prototype permet la surcharge des prototype mais aussi des objet. un langage à prototype connait la notion d'objet alors que les langage à ba se de classe ne connaissent en général que la notion d'instance. etc. cherchez donc à bien comprendre la notion de prototype et à l'exploiter au maximum plutôt que de vous contraindre dans la notion de classe qui restreint votre champs d'action. je ne dis pas que les langage à base de classe sont moins bon. je dis qu'implémenter la notion de classe sur la notion de prototype est restrictif. c'est comme si vous utilisiez C++ pour faire de la programmation fonctionnelle ou un langage fonctionnel pur faire du C++ exploiter les capacités du langue de base est toujours plus efficace. A+JYT |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com