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 habitué
    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
    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 658
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    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 658
    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')
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

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