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 :

Entourer (wrap) des fonctions à nombre d'arguments variable


Sujet :

JavaScript

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 14
    Points : 11
    Points
    11
    Par défaut Entourer (wrap) des fonctions à nombre d'arguments variable
    Bonjour,

    Après quelques heures de recherche sur les forums et quelques heures de tentatives diverses, je me résous à poser mon problème ici. J'ai un niveau moyen en javascript.

    Ce que je veux faire : à des fins de débuggage de mon code, je voudrais ajouter à toutes les méthodes de mes objets un appel à une fonction qui me permettra un suivi personnalisable de la marche du programme (que ne me permet pas Firebug par exemple). J'en profite aussi pour définir le nom de ces méthodes afin qu'il soit accessible par caller.name.

    Mon problème : je sais utiliser la méthode `wrap` du framework `prototype` lorsque le nombre d'arguments de la fonction à entourer est connu, mais dans mon problème, ce nombre est forcément variable, il dépend de chaque méthode.

    Ma question : comment utiliser la méthode `warp` avec un nombre indéfini d'arguments ?

    Voilà une synthèse de mon code :

    Mon objet est le suivant :
    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
     
    var monObjet = {
     
        name: "monObjet",
        propriete1: 1256,
        propriete2: "ma propriété",
     
        methode1: function(arg1, arg2) {
            // …
        },
     
        methode2: function() {
            // …
        }
    }
    Ma fonction à créer :

    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
     
    function DebugAddCallAndName(obj) {
     
        //= Boucle sur chaque propriété
        // Je pourrais aussi utiliser `$A(obj).each(function…)`
        for ( var prop in obj ) {
     
            //- Ne traiter que les fonctions
            if ( "function" != typeof obj[prop] ) continue ;
     
            //- Je définis le nom de la propriété
            //  Il sera "<nom objet>.<nom méthode>"
            obj[prop].name= obj.name + "." + prop ;
     
            //- J'ajoute à chaque propriété un appel à ma fonction
            // de débuggage (DebugFonction)
            // ### C'est ici que je cale ###
            // ### Le code ci-dessous ne fonctionne pas ###
            obj[prop]= obj[prop].wrap(
                function(ma_methode){
                    // Ajout de l'appel à la fonction de débuggage
                    DebugFonction(arguments);
                    // Appel normal à la méthode (# des arguments ? #)
                    ma_methode();
            });
     
        }
    }
    J'utilise naturellement, pour "préparer" mon objet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    DebugAddCallAndName(monObjet) ;
    Au cas où, une idée de ma fonction de débuggage :

    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
     
    function DebugFonction(args) {
    // args = propriété "arguments" de la fonction
     
        //- Fonction traitée
        var fonction_traitee= args.callee ;
        var nom_fonction_traitee= fonction_traitee.name ;
     
        //- Arguments
        var liste_arguments= fonction_traitee.argumentNames() ;
        // …
     
        //- Fonction appelante
        var fonction_appelante= null ;
        var nom_fonction_appelante= null;
        if ("undefined" != typeof fonction_traitee.caller && fonction_traitee.caller) {
            fonction_appelante= fonction_traitee.caller ;
            nom_fonction_appelante= fonction_appelante.name ;
        }
        // …
     
        //= Traitement/affichage
        // …
    }
    Un grand merci à toute personne qui pourra me donner un coup de main, si mon problème a été suffisamment bien exposé pour être compris…

    Bien à vous,

    Phil

  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 666
    Points
    66 666
    Billets dans le blog
    1
    Par défaut
    regarde du coté de arguments ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    function bar(){
    alert (arguments[0])
    alert(arguments[1]
    }
     
    bar('un',' deux')

Discussions similaires

  1. Réponses: 3
    Dernier message: 04/02/2011, 15h00
  2. [Fortran 95] Fonction au nombre d'arguments variable
    Par Ymkjen dans le forum Fortran
    Réponses: 1
    Dernier message: 12/02/2009, 15h15
  3. Réponses: 3
    Dernier message: 23/08/2007, 00h39
  4. Réponses: 4
    Dernier message: 31/10/2005, 17h48
  5. Réponses: 9
    Dernier message: 24/05/2005, 16h34

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