IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

Creation de classe


Sujet :

JavaScript

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 854
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 854
    Par défaut Creation de classe
    bonjour,

    dans ma classe, j'ai des variables local et public

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function MaClasse(){
      var varLocal = "toto"
     
      this.varPublic
    }
    comment faire pour que varLocal soit accessible depuis mes methodes (car le code suivant ne fonctionne pas) ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    MaClasse.prototype = { 
        maMethode: function() {
            alert(varLocal + " " + this.varPublic)
        }
    }



    Aussi, est-il possible de créer une methode privée ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function MaClasse(){
      var varLocal = "toto"
     
      function maMethode(){
          alert(varLocal )
      }
    }
    => le problème est que si je fais ça, maMethode va être créer pour hauqe objet et va donc consommer de la mémoire inutilement, non ?


    merci d'avance

  2. #2
    Membre chevronné

    Profil pro
    Inscrit en
    Février 2010
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 119
    Par défaut
    Citation Envoyé par boboss123 Voir le message
    bonjour,

    dans ma classe, j'ai des variables local et public

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function MaClasse(){
      var varLocal = "toto"
     
      this.varPublic
    }
    comment faire pour que varLocal soit accessible depuis mes methodes (car le code suivant ne fonctionne pas) ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    MaClasse.prototype = { 
        maMethode: function() {
            alert(varLocal + " " + this.varPublic)
        }
    }
    ta variable dans MaClasse est VRAIMENT locale, elle n'est pas visible en dehors des closures les + proches ({})
    • soit tu veux utiliser prototype et tu la transforme en this.varLocal
    • soit tu déclares différemment ta classe en mettant this.maMethode = function() ..., du coup ta méthode et ta varLocal sont dans le même scope
    • ou alors la meilleure des options, qui répond aussi à ta 2nde question, plus bas


    Citation Envoyé par boboss123 Voir le message
    Aussi, est-il possible de créer une methode privée ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function MaClasse(){
      var varLocal = "toto"
     
      function maMethode(){
          alert(varLocal )
      }
    }
    => le problème est que si je fais ça, maMethode va être créer pour hauqe objet et va donc consommer de la mémoire inutilement, non ?


    merci d'avance
    Pour ne pas surconsommer de la mémoire en utilisant prototype, émuler variables privées et publiques, ainsi que les variables statiques, voici THE syntaxe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    var monNameSpaceAMoi = {}; // l'objet global dans lequel on stocke toutes les classes du projet, histoire de ne rien laisser trainer dans window.
     
    (function () { // permet de simuler un scope local
    monNameSpaceAMoi.maClasse = function() { // on se rattache à l'objet global pour être accessible de partout
      // ici le code du CONSTRUCTEUR
    };
     
    // ici les méthodes et variables PUBLIQUES, accessibles depuis l'instance d'un objet maClasse
    monNameSpaceAMoi.maClasse.prototype = {
        methode1:function() { },
        methode2:function() { },
        variable1: 'valeur par défaut'
    };
     
    // c'est comme ça qu'on déclare des variables ou des fonctions STATIQUES
    monNameSpaceAMoi.maClasse.methodeStatique = function() {};
     
    // variables ou fonctions PRIVEES, accessibles depuis uniquement cette classe
    var varLocale = 'youpie',
        self = monNameSpaceAMoi.maClasse, // raccourci pratique à utiliser dans la classe
        fonctionLocale = function() {
     
        },
        varLocale2 = 'youpie2';
     
    })(); // fermeture du scope de la classe et autoexécution
     
     
    // depuis tout le reste du projet, on peut accéder à cela : 
    var oInstance = monNameSpaceAMoi.maClasse();
    // méthode d'une instance
    oInstance.methode1(); 
    // méthode statique
    monNameSpaceAMoi.maClasse.methodeStatique();
    // aucun moyen d'accéder à varLocale, on a donc bien une variable privée
    console.log(varLocale); // undefined
    Oui, JS est un peu lourd pour gérer de l'objet simplement ... mais comme la programmation orientée objet est la seule qui tienne la route quand on fait des applis web, il n'y a pas d'autres choix que d'adopter pour chacune des classes cette syntaxe

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 854
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 854
    Par défaut
    merci beaucoup pour ta reponse

    c'est quoi une fonction/variable statique ?


    peux-tu me dire si j'ai bien créé mon objet, stp ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
     
    var monNameSpace = {}; // l'objet global dans lequel on stocke toutes les classes du projet, histoire de ne rien laisser trainer dans window.
     
    (function () { // permet de simuler un scope local
    monNameSpace.ObjAjaxEx = function() { // on se rattache à l'objet global pour être accessible de partout
      // ici le code du CONSTRUCTEUR
    };
     
    // ici les méthodes et variables PUBLIQUES, accessibles depuis l'instance d'un objet maClasse
    monNameSpace.ObjAjaxEx.prototype = {
     
    	// methodes publiques
    	run: function() {
    		if(window.XMLHttpRequest){
    			xhr = new XMLHttpRequest()
    			xhr.onreadystatechange = recieveRequest
    			xhr.open(this.methode, this.url, true)
    			xhr.send(this.dataToSend)
    		} else if(window.ActiveXObject){
    			try {
    				xhr = new ActiveXObject("Msxml2.XMLHTTP")
    			} catch (e) {
    				xhr = new ActiveXObject("Microsoft.XMLHTTP")
    			}
     
    			if(xhr) {
    				xhr.onreadystatechange = recieveRequest
    				xhr.open(this.methode, this.url, true)
    				xhr.send(this.dataToSend)
    			}
    		} else {
    			alert("Votre Navigateur Internet ne supporte pas XMLHttpRequest")
    		}
     
    		this.startTime = new Date().getTime()
    	},
     
    	// variables publiques	
    	methode: "GET",
    	url: null,
    	dataToSend: null,
    	callBackFuncRecieveRequest: null,
    	startTime: null;
    };
     
    // c'est comme ça qu'on déclare des variables ou des fonctions STATIQUES
    //monNameSpace.ObjAjaxEx.methodeStatique = function() {};
     
    // variables ou fonctions PRIVEES, accessibles depuis uniquement cette classe
    	var xhr = null,
        self = monNameSpace.ObjAjaxEx, // raccourci pratique à utiliser dans la classe
        recieveRequest = function() {
    		if(xhr){
    			if(xhr.readyState == 4){
    				if(xhr.status == 200) {
    					eval(xhr.responseText)
    					this.callBackFuncRecieveRequest(xhr)
    				}
    			}
    		}	
        },
     
    })(); // fermeture du scope de la classe et autoexécution
     
     
    // depuis tout le reste du projet, on peut accéder à cela : 
    var oInstance = monNameSpace.ObjAjaxEx();
     
    // propriété d'une instance
    oInstance.callBackFuncRecieveRequest = function(xhr){alert('requete reçue : ' + xhr);};
     
    // méthode d'une instance
    oInstance.run(); 
     
    // méthode statique
    //monNameSpace.ObjAjaxEx.methodeStatique();
     
    // aucun moyen d'accéder à varLocale, on a donc bien une variable privée
    //console.log(varLocale); // undefined

  4. #4
    Membre chevronné

    Profil pro
    Inscrit en
    Février 2010
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 119
    Par défaut
    Citation Envoyé par boboss123 Voir le message
    c'est quoi une fonction/variable statique ?
    pareil qu'en PHP, mais si tu sais pas ce que c'est en PHP ça ne va pas t'avancer beaucoup ... Soit tu es obligé d'instancier un objet pour accéder à ses variables/méthodes, soit tu accèdes directement sans passer par une instance si elles ont été déclarées en statique

    Citation Envoyé par boboss123 Voir le message
    peux-tu me dire si j'ai bien créé mon objet, stp ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    xhr = new XMLHttpRequest()
    tu oublies les ; à chaque fin de ligne, pas sur que ça marche dans toutes les situations sur IE
    et fais attention à la , finale dans ta dernière déclaration, IE ne l'accepte pas

    Citation Envoyé par boboss123 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    	this.callBackFuncRecieveRequest(xhr)
    ta fonction privée est définie en dehors du scope de ton objet, donc this ne fait pas référence à l'objet mais à la fonction elle même .. donc ça ne peut pas marcher.
    Il faut soit stocker dans un tableau privé toutes les instances de ta classe et au callback XHR savoir retrouver la bonne instance, soit ne pas utiliser d'objet, soit mettre ta fonction en fonction publique dans le prototype

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 854
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 854
    Par défaut
    Citation Envoyé par jpvincent Voir le message
    Il faut soit stocker dans un tableau privé toutes les instances de ta classe et au callback XHR savoir retrouver la bonne instance
    rah c'est barbare comme methode

    merci pour les infos

  6. #6
    Membre chevronné

    Profil pro
    Inscrit en
    Février 2010
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 119
    Par défaut
    Citation Envoyé par boboss123 Voir le message
    rah c'est barbare comme methode
    On dit JavaScript

    sinon il y a qlq chose qui me turlupine : concernant XHR, pourquoi ne pas avoir repris une librairie existante ?
    autoformation ?
    tout petit site ?

  7. #7
    Expert confirmé
    Avatar de le_chomeur
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2006
    Messages
    3 653
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 3 653
    Par défaut
    Quid du poid au niveau de la mémoire entre l'utilisation de prototype et la déclaration a l'intérieur de la classe ??

    des exemples pouvant être mesuré ? un bench ?

  8. #8
    Membre chevronné

    Profil pro
    Inscrit en
    Février 2010
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 119
    Par défaut
    Citation Envoyé par le_chomeur Voir le message
    Quid du poid au niveau de la mémoire entre l'utilisation de prototype et la déclaration a l'intérieur de la classe ??

    des exemples pouvant être mesuré ? un bench ?
    impossible d'en retrouver un, mais je me souviens des conclusions : si on joue avec plusieurs milliers d'objets, les différences de perfs commencent à être perceptibles entre mettre ses méthodes dans le prototype ou dans le constructeur (dans le constructeur, elles sont redéfinies à chaque fois, encombrant la mémoire).
    Par contre JS est piégeux : si par exemple tu définis dans le prototype un tableau, il est partagé entre toutes les instances de la classe alors que les autres types (Number, String et même Function) se comportent normalement.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. creation de classe et mapping hibernate
    Par cyreel dans le forum Persistance des données
    Réponses: 3
    Dernier message: 25/09/2008, 10h23
  2. creation de classe
    Par deubelte dans le forum Macros et VBA Excel
    Réponses: 18
    Dernier message: 23/11/2007, 08h37
  3. pb de creation de classe de connexion
    Par oceane751 dans le forum JDBC
    Réponses: 2
    Dernier message: 30/07/2007, 15h37
  4. creation dune classe et utilisation
    Par le_voisin dans le forum C++
    Réponses: 9
    Dernier message: 30/08/2006, 21h38
  5. Parseur XML to Java pour creation de Class
    Par yannick101 dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 18/07/2005, 14h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo