1. #1
    Membre régulier
    Profil pro
    Inscrit en
    août 2006
    Messages
    94
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Canada

    Informations forums :
    Inscription : août 2006
    Messages : 94
    Points : 114
    Points
    114

    Par défaut Créer des instances d'objets à partir d'une fonction commune

    Bonjour,

    J'éprouve des difficultés à passer du C# au javascript, notamment en ce qui a trait à l'instanciation. Je poste dans le forum node.js car je me dis que ce problème est peut-être plus rencontré dans le cadre d'applis 'back-end'.

    Je crée 2 objets distincts à partir du mot-clef new et d'une fonction appelée Kid : deux enfants sont 'instanciés', et chacun d'entre eux saisit un ballon et le fait rebondir, plus ou moins fort. Lorsque le ballon cesse de rebondir (le temps de rebondissement étant ici lié directement à la force de l'enfant), le programme nous l'indique.

    Le problème que j'ai, est qu'à un moment donné, le premier 'Kid' (ses données) semble être écrasé par le dernier 'Kid' qui a été instancié... je ne comprends pas pourquoi.

    Voici la séquence de logs à laquelle je m'attend.
    1. Mike arrived in the garden. The kid wants to play with a balloon....
    2. Elia arrived in the garden. The kid wants to play with a balloon....
    3. Ensure that Mike's name is Mike...
    4. Ensure that Elia's name is Elia...
    5. Mike just got a balloon and wrote his name on it !
    6. Mike makes the balloon bouncing (force 10) !
    7. Elia just got a balloon and wrote his name on it !
    8. Elia makes the balloon bouncing (force 4) !
    9. Elia's balloon has stopped bouncing... The name written on it is Elia.
    10.Mike's balloon has stopped bouncing... The name written on it is Mike.
    Voici la séquence de logs que j'obtiens.
    1. Mike arrived in the garden. The kid wants to play with a balloon....
    2. Elia arrived in the garden. The kid wants to play with a balloon....
    3. Ensure that Mike's name is Mike...
    4. Ensure that Elia's name is Elia...
    5. Elia just got a balloon and wrote his name on it ! (self.kidName:Elia)
    6. Elia makes the balloon bouncing (force 10) !
    7. Elia just got a balloon and wrote his name on it ! (self.kidName:Elia)
    8. Elia makes the balloon bouncing (force 4) !
    9. Elia's balloon has stopped bouncing... The name written on it is Elia.
    10.Elia's balloon has stopped bouncing... The name written on it is Elia.
    On dirait que l'instance 'Mike. est écrasée dès l'appel à la fonction bounce...

    Voici le détail des 3 fichiers .js que j'ai créé.

    App.js (celle que j'exécute)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    const timers = require("timers");
    const Kid = require('./kid.js');
     
    var mike = new Kid('Mike');
    var elia = new Kid('Elia');
     
    console.log(`Ensure that Mike's name is ${mike.name}...`);
    console.log(`Ensure that Elia's name is ${elia.name}...`);
     
    mike.bounce(10);
    elia.bounce(4);
    Kid.js
    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
    const Balloon = require('./balloon.js');
    var self;
     
    function Kid(name){
        self=this;
        this.name=name;
     
        console.log(`${this.name} arrived in the garden. The kid wants to play with a balloon....`);
    }
     
    Kid.prototype.bounce = function(force1To10) {
        var balloon = new Balloon(self.name); 
        balloon.bounce(force1To10);    
        balloon.on('balloonStopped',(kidnameWrittenOnIt)=>{
            console.log(`${self.name}'s balloon has stopped bouncing... The name written on it is ${kidnameWrittenOnIt}.`);
        });
    };
     
    module.exports=Kid;
    Balloon.js
    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
    const timers = require("timers");
    var inherits = require('util').inherits;  
    var EventEmitter = require('events').EventEmitter;
    var self;
     
    function Balloon(kidName) {
        self = this;
        this.kidName = kidName;
     
        this.bounce = function(kidsPower1To10){
            console.log(`${self.kidName} makes the balloon bouncing (force ${kidsPower1To10}) !`);
            timers.setTimeout(() => {
                self.emit('balloonStopped',self.kidName);
            }, kidsPower1To10*1000); 
        }
     
        console.log(`${this.kidName} just got a balloon and wrote his name on it ! (self.kidName:${this.kidName})`);
    }
     
    inherits(Balloon, EventEmitter);
    module.exports = Balloon;
    Pour exécuter:
    Merci d'avance pour toute explication qui m'aidera à résoudre mon problème !

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    août 2006
    Messages
    94
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Canada

    Informations forums :
    Inscription : août 2006
    Messages : 94
    Points : 114
    Points
    114

    Par défaut

    Après réponse obtenue sur un autre forum, voici la solution:
    la variable 'self' est globale, c'est donc normal qu'elle se voit écrasée à la deuxième affectation.
    Utiliser directement 'this' plutôt que 'self' a réglé le problème.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 29/01/2016, 14h01
  2. [AC-2010] Créer des enregistrements par date à partir d'une période
    Par tangono dans le forum Access
    Réponses: 1
    Dernier message: 23/04/2013, 12h46
  3. Créer des groupes de 4 à partir d'une liste
    Par Coussati dans le forum Général Algorithmique
    Réponses: 6
    Dernier message: 07/12/2011, 22h39
  4. Réponses: 9
    Dernier message: 25/01/2011, 13h32
  5. Réponses: 2
    Dernier message: 20/06/2007, 13h12

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