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 :

[POO] visibilité d'une fonction dans un objet JavaScript


Sujet :

JavaScript

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Canada

    Informations professionnelles :
    Activité : Retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2007
    Messages : 4
    Points : 6
    Points
    6
    Par défaut [POO] visibilité d'une fonction dans un objet JavaScript
    Je définis un objet JavaScript qui contient une variable et des méthodes.

    Lorsque j'essaie d'utiliser une des méthodes déjà définie à l'aide de this, le navigateur me retourne une erreur qui me dit que la méthode n'en n'est pas une.

    Pourtant, j'utilise cette technique dans d'autres objets et ça fonctionne. Quelqu'un aurait-il une idée?

    Voici les deux exemples, le premier génère une erreur et le deuxième est correct.
    Ce que je veux, c'est utiliser la première méthode...


    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
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
    	<head>
    		<title>Fenêtre glissante</title>
    		<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-15" />
    		<meta http-equiv="Content-Script-Type" content="text/javascript" />
    		<script type="text/javascript" >
    			// =================================
    			// Création de l'objet 
    			function objNav( ) {
    			}
    			// ------------------------------------
    			// Ajout des propriétés et des méthodes à l'objet
    			objNav.prototype = {	
    				navi: 0, 
     
    				fn1: function ( ) {
    					this.navi = "XXX";
    				},
     
    				fn2: function (e) {
    					if (!this.navi) { 
    						this.fn1 ();  // <- Probleme ici... fn1 non reconnue
    					}
    					alert (this.navi);
    				}
    			}
    			// ===========================
    			// Association des evenements
    			function init() {
    				var nav = new objNav ();
    				document.onclick = nav.fn2;
    			}
    		// ]]>
    		</script>
    	</head>
     
    	<body onload="init();">
    		<h2>Objet en erreur</h2>
    	</body>
    </html>
    Voici le deuxième

    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
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
    	<head>
    		<title>Fenêtre glissante</title>
    		<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-15" />
    		<meta http-equiv="Content-Script-Type" content="text/javascript" />
    		<script type="text/javascript" >
    			// =================================
    			// Création de l'objet 
    			function objNav( ) {
    			}
    			// ------------------------------------
    			// Ajout des propriétés et des méthodes à « interNavigateur »
    			objNav.prototype = {	
    				navi: 0, 
     
    				fn2: function (e) {
    					if (!this.navi) { 
    						this.navi = "XXX";  
    					}
    					alert (this.navi);
    				}
    			}
    			function init() {
    				var nav = new objNav ();
    				document.onclick = nav.fn2;
    			}
    		</script>
    	</head>
     
    	<body onload="init();">
    		<h2>Objet OK</h2>
    	</body>
    </html>

  2. #2
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 640
    Points : 66 663
    Points
    66 663
    Billets dans le blog
    1
    Par défaut
    un petit return pour la route ?

  3. #3
    Expert confirmé
    Avatar de javatwister
    Homme Profil pro
    danseur
    Inscrit en
    Août 2003
    Messages
    3 681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : danseur

    Informations forums :
    Inscription : Août 2003
    Messages : 3 681
    Points : 5 221
    Points
    5 221
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    document.onclick = function(){nav.fn2()};

  4. #4
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Points : 2 757
    Points
    2 757
    Par défaut
    solution = remplacer this par objNav.prototype

    tu tombes ici dans LE piège du this. this tient son sens du contexte à partir duquel il est appelé.

    quand tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    document.onclick = nav.fn2;
    alors la fonction fn2 est affectée à document.onclick et, dans ce contexte, this = document... et document ne défini pas de fonction fn1 (CQFD)

    la solution de javatwister fonctionne car là fn2 est appelé dans le contexte de nav

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Canada

    Informations professionnelles :
    Activité : Retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2007
    Messages : 4
    Points : 6
    Points
    6
    Par défaut
    Merci pour vos réponses rapides.

    J'avais bien lu que « this » se rapportait au contexte, mais là j'en comprends mieux la signification...

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

Discussions similaires

  1. [POO] Appel d'une fonction d'un objet
    Par dragonfly dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 02/12/2009, 13h49
  2. [POO] dans une classe, appeler une fonction dans une méthode
    Par arnaudperfect dans le forum Langage
    Réponses: 3
    Dernier message: 26/08/2007, 23h04
  3. Réponses: 2
    Dernier message: 20/06/2007, 12h12
  4. [Tableaux] visibilité d'une variable dans une fonction
    Par grinder59 dans le forum Langage
    Réponses: 2
    Dernier message: 10/05/2007, 18h06
  5. Réponses: 3
    Dernier message: 06/11/2005, 18h02

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