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 :

Ajouter une méthode à un objet anonyme ?


Sujet :

JavaScript

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Amateur...
    Inscrit en
    Juillet 2015
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Nouvelle-Zélande

    Informations professionnelles :
    Activité : Amateur...
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2015
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Ajouter une méthode à un objet anonyme ?
    Bonjour à tous,

    Voici mon problème. J'ai un fichier PHP qui fait une requete MySQL sur une base de données, et me "print" le résultat encodé en JSON. Je récupère ce résultat dans un script JavaScript via une requête Ajax que je JSON.parse(). Je me retrouve avec un tableau d'objets anonymes, ce qui je suppose est normal. Ca ressemble à peu près à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [{"id":"1","name":"Name1","phone":"36892252","mobile":"0","lat":"-44.86687","lon":"170.9088789"},{"id":"2","name":"Name2","phone":"3268266","mobile":"272424877","lat":"-40.3137859","lon":"175.7596243"}]
    Mon but désormais est d'ajouter des méthodes à ces objets, mais je ne sais pas du tout comment m'y prendre. Ma première et seule tentative a été de passer par le prototype du premier objet de ce tableau, mais c'est un échec cuisant. Voici le code 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
    xhr.addEventListener('readystatechange', function() {
     
         if (xhr.readyState === 4 && xhr.status === 200) {
    		response = JSON.parse(xhr.responseText);
     
    		response[0].prototype.testFunction() = function() {
    			console.log("OK");
    		}
     
    		for (var i = 0 ; i < response.length ; i++) {
    			testFunction();
    		}
     
    	 }
     
    }, false);
    La console me renvoie "Uncaught TypeError : Cannot read property 'testFunction' of undefined".

    Pourtant response[0] fait bien référence à un objet, que je peux afficher sans problème avec console.log(), et ma boucle for parvient sans problème à parcourir mon tableau d'objets. Mieux : typeof response ET typeof response[0] me donnent tous deux la réponse attendue : object ; mais typeof response[0].prototype me répond "undefined". Dois-je conclure qu'un objet anonyme n'a pas de prototype ? Comment je peux donc faire pour rajouter une méthode à tous les objets que me renvoie ma requête AJAX ?

    Merci de vos lumières...

  2. #2
    Membre émérite
    Avatar de Nothus
    Homme Profil pro
    aucun
    Inscrit en
    Juillet 2009
    Messages
    200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : aucun
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2009
    Messages : 200
    Points : 2 575
    Points
    2 575
    Billets dans le blog
    27
    Par défaut
    Un objet peut se comporter en partie comme un "tableau"...

    Ainsi :
    Obj.var == Obj[var]

    Si on essaye dans la console, ça fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    varJSON = {"ok":"ok","ko":"ko"};
    Object { ok: "ok", ko: "ko" }
    varJSON
    Object { ok: "ok", ko: "ko" }
    varJSON.ok
    "ok"
    varJSON["ok"]
    "ok"
    Donc partant de ce constat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    varJSON = (... objet...) 
    varMethodes = { 
    <div style="margin-left:40px">"methode_un": function() {},</div><div style="margin-left:40px">"methode_deux": function() {}</div>(...) 
     
    };
    Et tu boucles deux fois :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for(var v in varJSON) { 
    for(var vv in varMethodes) { 
    varJSON[v][vv] = varMethodes[vv]; 
    } 
    }
    En gros, tu appliques une clé associant à une valeur qui est de fait une fonction.
    "En dehors des langages de la famille LISP et du modèle RDF, point de salut."

  3. #3
    Membre émérite
    Avatar de Nothus
    Homme Profil pro
    aucun
    Inscrit en
    Juillet 2009
    Messages
    200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : aucun
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2009
    Messages : 200
    Points : 2 575
    Points
    2 575
    Billets dans le blog
    27
    Par défaut
    Autre moyen de vérifier dans la console, peut-être plus clair dans son principe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Bidule = function() { alert("merveilleux !"); }; 
    varObj = {}; 
    varObj["Bidule"] = Bidule; 
    alert(typeof varObj.Bidule); 
    varObj.Bidule();
    Tu auras deux alertes à l'écran : "function" suivie de "merveilleux !". Preuve que la fonction est devenue une méthode de ton objet anonyme.
    "En dehors des langages de la famille LISP et du modèle RDF, point de salut."

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    Amateur...
    Inscrit en
    Juillet 2015
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Nouvelle-Zélande

    Informations professionnelles :
    Activité : Amateur...
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2015
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Parfait, ca fonctionne tres bien, merci.

    Mais du coup, est-ce que ca veut dire qu'un objet anonyme n'a pas de prototype ?

  5. #5
    Membre émérite
    Avatar de Nothus
    Homme Profil pro
    aucun
    Inscrit en
    Juillet 2009
    Messages
    200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : aucun
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2009
    Messages : 200
    Points : 2 575
    Points
    2 575
    Billets dans le blog
    27
    Par défaut
    Ton problème me semble être ailleurs...

    Tu reçois une chaîne de caractère en JSON, que tu parses (que tu décodes en somme), pour fabriquer ton objet anonyme.

    Teste dans la console :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    varJSON = '{"ok":"function() { alert(\'ok\'); }"}';
    varJSON = JSON.parse(varJSON); /*Edit : petite coquille, j'ai écrit trop vite ^^ */ 
    alert(typeof varJSON.ok); 
    typeof varJSON.ok()
    Cela ne fonctionne pas. Car JSON.parse ne crée pas la fonction. Il faudrait, par exemple par une expression régulière, regarder quelles clés peuvent être des fonctions (ex. : "fct_ok") et faire un eval sur la valeur.

    Cependant il est déconseillé pour des raisons de sécurité d'utiliser eval pour ce type de pratique. Mieux vaut que ton retour fasse référence à des fonctions déjà existantes dans ton script d'appel pour garder le contrôle de s'y exécute. Avec typeof, cela me semble tout à fait possible :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typeof ObjMaitre[varJSON.retour]!="undefined"
    "En dehors des langages de la famille LISP et du modèle RDF, point de salut."

  6. #6
    Membre émérite
    Avatar de Nothus
    Homme Profil pro
    aucun
    Inscrit en
    Juillet 2009
    Messages
    200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : aucun
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2009
    Messages : 200
    Points : 2 575
    Points
    2 575
    Billets dans le blog
    27
    Par défaut
    Voici une base pour t'aider si tu tiens à utiliser eval :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    varJSON = '{"ok":"function() { alert(\'ok\'); }"}'; 
    varJSON = JSON.parse(varJSON); 
    eval("var truc = "+varJSON.ok); 
    alert(typeof truc); 
    truc();
    "En dehors des langages de la famille LISP et du modèle RDF, point de salut."

  7. #7
    Rédacteur

    Avatar de danielhagnoul
    Homme Profil pro
    Étudiant perpétuel
    Inscrit en
    Février 2009
    Messages
    6 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant perpétuel
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Points : 22 933
    Points
    22 933
    Billets dans le blog
    125
    Par défaut
    EDIT

    Désolé, mon code ne fonctionne pas comme prévu (je n'avais pas eu le temps de le tester ce matin).

    Blog

    Sans l'analyse et la conception, la programmation est l'art d'ajouter des bogues à un fichier texte vide.
    (Louis Srygley : Without requirements or design, programming is the art of adding bugs to an empty text file.)

Discussions similaires

  1. Réponses: 4
    Dernier message: 30/05/2007, 14h35
  2. [objet] appeler une méthode d'objets contenus dans un tableau (iterator ?)
    Par psychomatt dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 21/09/2006, 16h28
  3. "ajouter une méthode dans une méthode"
    Par Zorgloub dans le forum Langage
    Réponses: 1
    Dernier message: 09/04/2006, 12h53
  4. [POO] affectation dynamique d'une méthode à un objet
    Par Delphi-ne dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 17/02/2006, 21h17
  5. Ajouter un méthode à un objet
    Par norvel dans le forum Access
    Réponses: 2
    Dernier message: 03/10/2005, 16h50

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