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 :

Masquer dans la commande (..IN..) la/les fonctions "rajoutées" d'un objet


Sujet :

JavaScript

  1. #1
    Membre à l'essai
    Homme Profil pro
    Lisses
    Inscrit en
    Juillet 2013
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Lisses
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2013
    Messages : 25
    Points : 11
    Points
    11
    Par défaut Masquer dans la commande (..IN..) la/les fonctions "rajoutées" d'un objet
    Bonjour,

    Comment éviter qu'une boucle de type for (... in ...) restitue le nom de la fonction ajoutée dans un objet ?
    Exemple (réalisé à la console Google):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    o={a:1,b:2,c:3}
    // si j'écris :  
    for (p in o){alert (p)}
    // j'obtiens bien 3 boites de message, une pour chaque propriété a,b, et c ---- jusque la je suis ok
     
    //mais si on fait :
    o.constructor.prototype.message=function (m){alert(m)}
    //puis 
    for (p in o){alert (p)}
     
    //Là cela ne va plus j'obtient une alerte avec "message" qui est une (ma) fonction
    Question : Comment "MASQUER POUR LA COMMANDE FOR (...IN...)" la/les fonctions "rajoutées" dans l'objet ?

  2. #2
    Membre chevronné

    Homme Profil pro
    Ingénieur Hospitalier
    Inscrit en
    Juillet 2004
    Messages
    993
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Hospitalier
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 993
    Points : 1 768
    Points
    1 768
    Billets dans le blog
    1
    Par défaut prototype vs __proto__
    __proto__ est l'actuel object utilisé (préalablement créer) prototype est l'object qui permet de créer __proto__

    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ( new Bar ).__proto__ === Bar.prototype
    ( new Bar ).prototype === undefined

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    o={a:1,b:2,c:3}
    // si j'écris :
    for (p in o){alert (p)}
    // j'obtiens bien 3 boites de message, une pour chaque propriété a,b, et c ---- jusque la je suis ok
     
    //mais si on fait :
    o.constructor.__proto__.message= (function (m){alert(m)});
    //puis
    for (p in o){alert (p)}

  3. #3
    Expert éminent
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Points : 9 127
    Points
    9 127
    Par défaut
    tu peux pas un membre d'un objet est un membre d'un objet
    et le for in parcours tous les membres.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    o={a:null};
    o.a=1;  //la valeur 1 est affecté au membre a  (le membre a n'est pas modifié seule sa valeur a changée)
    alert(o.a); //1
    o.a = 'toto'; // la string 'toto' est crée et une référence à cette string est affecté au membre a (le membre a n'est pas modifié seule sa valeur a changée)
    alert(o.a); //toto
    o.a = {t:15}; // l'objet {t:15} est crée et une référence à cet objet est affecté au membre a (le membre a n'est pas modifié seule sa valeur a changée)
    alert(o.a); //Object
    o.a = function(){};// la fonction function(){}' est crée et une référence à cette fonction est affecté au membre a (le membre a n'est pas modifié seule sa valeur a changée)
    alert(o.a); //function
    le membre a de l'objet o n'a pas changé durant tout le script il est resté membre de o car c'est sa nature.
    seule la valeur du membre à changé.
    le for in parcourant tous les membres il n'y a pas de raison qu'il en ignore certain parce que leur valeur est une valeur comme une autre.

    A+JYT

  4. #4
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    16 959
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 959
    Points : 44 122
    Points
    44 122
    Par défaut
    Bonjour,
    il te faut utiliser la méthode hasOwnProperty() pour tester si la propriété est définie sur l'objet lui même et non ajoutée via prototype ou autre.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for( var p in o) {
        if( o.hasOwnProperty( p)) {
            alert( p);
        }
    }

  5. #5
    Membre à l'essai
    Homme Profil pro
    Lisses
    Inscrit en
    Juillet 2013
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Lisses
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2013
    Messages : 25
    Points : 11
    Points
    11
    Par défaut Curieux tout cela
    Bonjour,

    C'est encore moi.

    Si au lieu de créer un objet quelconque comme dans l'exemple fourni à l'ouverture de la discussion, vous faites la démarche avec l'objet JavaScript standard "Object()"

    En faisant ceci dans la console gogole :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for (p in Object()){alert(p)}
    //Aucune alerte n'est affichée.

    Et pourtant des fonctions sont bien évidemment présentes dans l'objet "Object":
    (constructor, hasOwnProperty, ... pour n'en citer que quelques une...)

    Maintenant si vous rajoutez une fonction à l'objet "Object()" pour l'enrichir d'une fonctionnalité comme par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Object.prototype.valueIsIn=function (value){
    	if (Array.isArray(this))return ($.inArray(value,this)!=-1);
    	for (var prop in this){
    		if (this[prop]==value)return true;
    	}
    	return false;
    }
    Qui renseigne si une propriété contient la valeur indiquée

    On a bien avec l'IntelliSense de Google la fonction "valueIsIn" qui s'affiche avec les autres dans la boite lorsque l'on tape à la console :
    Object. // suivi de contrôle espace//

    En plus elle fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    x={a:1,b:2,c:3}
    x.valueIsIn(2)// Affiche "true"
    x.valueIsIn(5)//Affiche "false"
    Par contre on a toujours le soucis avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for (prop in x){alert(prop)}
    // Qui affiche certes 3 messages un pour chaque propriété a,b,c // La c'est OK
    // Mais qui en affiche une quatrième avec le nom de la fonction  "valueIsIn"
    D'où la question initiale :
    Comment en rajoutant une fonction sur le propotype de Object() celle ci se comporte comme les autres
    qui s'y trouvent "de base en standard" face à la commande for (..in..)

  6. #6
    Expert éminent
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Points : 9 127
    Points
    9 127
    Par défaut
    encore une fois un membre est un membre
    c'est donc le comportement statndard

    Ce que tu veux c'est un comportement NON standard.
    le for in passe par tous les membres (les fonctions internes de JS ne sont pas des membres)

    Toi, ce que tu veux, c'est passer en revue les membres et en fonction de la nature de leur valeur agir différemment.

    Je ne vois pas ce qui t'empêche de le faire.
    Tu fais ça.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    var prop1 = 15;
    alert(prop1);
    var prop2 = function(){};
    alert(prop2);
    alors que tu veux faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    var prop1 = 15;
    if ('function' != typeof prop1) {
      alert(prop1);
    }var prop2 = function(){};
    if ('function' != typeof prop2) {
      alert(prop2);
    }
    Je ne vois vraiment pas ce qui t'empêche de le faire.

    IL faut que tu te mettes dans la tête qu'un membre d'un objet peut avoir n'importe quel type et que parmi ces types il y a le type fonction. C’est dans la structure du langage.
    Pour ce qui est du noyau de l'interprète, ce n'est pas un membre.

    Tu peux considérer qu'en JavaScript tout est objet. que chaque nom est en fait une référence à un objet
    Ainsi quand tu écris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var o = {a:12,b:'test',c:function(){}};
    tu crées un symbole o qui référence un objet
    cet objet est constitué de 3 membres ayant chacun un symbole et une valeur
    le premier a pour symbole a et référence un objet de type Inetger dont le contenu est 12
    le second a pour symbole b et référence un objet de type String dont le contenu est 'test'
    Le dernier a pour symbole c et référence un objet de type fonction dont le contenu est une fonction anonyme vide.

    Tout est donc parfaitement homogène. Il n'y a donc aucune raison que for in se comporte différemment avec certains membres.
    Cela fait partie du langage.

    Si tu as déjà travaillé avec d'autres langages à objet tu connais probablement la structure Map (java, C++ etc) ou Tableau associatif de PHP.
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    o = new HashMap<String, Object>();
    tu à l'a une Map dont les clefs sont des string et les valeurs des objets.
    Tu peux donc à priori y mettre ce que tu veux. Toute classe dérivant de Object peut être ajoutée à ta Map.

    maintenant, imagine une classe
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Class Function{
    ...
    }

    N'importe quelle instance de cette classe peut être ajoutée à ta Map.
    si tu fais
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for(Entry<String, Object> entry : o.entrySet()) {
        object p = entry.getValue();
        ...
    }
    Dis-moi pourquoi le for devrait ne pas te retourner les entrées don la valeur est une instance de la classe Fonction ?

    C'est pourtant ce que tu demandes.
    Et tu dis Oui, mais les fonctions internes elles ...

    Dans ce code Java la méthode entrySet ou la propriété length font-elles partie de la liste des valeurs de ta Map ?

    Le For in parcours tous les membres et que les membres sans aucune distinction de valeurs.
    Si tu veux faire des actions différentes en fonction du type de valeur libre à toi de le faire.

    A+JYT

  7. #7
    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
    d'accord avec No Smok en tout cas!

  8. #8
    Membre à l'essai
    Homme Profil pro
    Lisses
    Inscrit en
    Juillet 2013
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Lisses
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2013
    Messages : 25
    Points : 11
    Points
    11
    Par défaut Merci
    Merci de ta longue réponse.

    Mon besoin de "cacher" la/les fonctions rajoutées est motivé par un code qui bug du fait de l'utilisation de cette commande for .. in.. avec (avant) un ajout dans le prototype de "Object"
    Il ne m'est pas possible d'y apporter un correctif, (de par sa nature, et son utilisation dans le groupe entreprise).
    Tant pis.
    Enfin je reste sur ma fin. Je tire peut être une conclusion qui va fâcher.
    Mais je constate qu'il n'est pas fini le langage.
    La boucle for avec IN devrait passer en revu les "Vraies" propriétés (tout ce qui n'est pas du type "function")
    Car en définitive dans un objet quel qu'il soit il y a deux sorte d'informations :
    les données (scalaires , vectorielles, objets(pourvu que ce ne soit pas des fonctions)) et du code(les fonctions)
    Aussi il serai bien que le langage rajoute comme un paramètre sur le IN permettant de récupérer tout, uniquement les données ou uniquement les fonctions.

    Mais,
    Reste les "class"
    J'ai constaté que :

    si l'on écrit (dans un js) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    "use strict"
    class Polygone {
      constructor(hauteur, largeur) {
        this.nom = 'Polygone';
        this.hauteur = hauteur;
        this.largeur = largeur;
      }
      truc(m){console.log(m);}
    }
    On fait tourner
    , et dans la console on fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for (p in new Polygone()){alert (p)} //le new est obligatoire parce que Polygone est construit avec "Class"
    // pas de message avec "truc"

    Alors une réflexion vers la piste d'une redéfinition de la classe Object en "class Object" avec de nouvelle(s) fonctions

    Effet de bord potentiel : le code qui citerait ainsi : "mavarobj=Objet" ou "mavarobj=Objet()" // sans le mot clé new devant Objet
    Et Quid avec IE de micro mous ?

  9. #9
    Expert éminent
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Points : 9 127
    Points
    9 127
    Par défaut
    encore une fois qu'est qui t'empêche de traiter tous les membres et en fonction de leur nature agir différemment

    Quoi qu'il arrive, tu ne changeras pas le comportement du for in.
    Si le langage ne te conviens pas trouve en un autre ou crées en un.
    Mais tu ne changera pas le fonctionnement de javascript.

    Tu écris un code bugué qui coup de chance ne tombe jamais sur le bug.
    Puis tu ajoute un truc ailleurs et manque de bol ton code bugué tombe sur le bug est plante.

    Alors tu veux changer le langage pour qu'il ne tombe plus sur ton bug.
    Corrige ton bug c'est nettement plus sein.

    @NoSmoking t'as données des propriété et des méthodes du langage pour corriger ce bug dans ton code
    j'ai moi-même présenté en détail la situation pour te permettre de le corriger.
    je pense avoir suffisamment détaillé mes réponse pour que tu comprenne bien ce que fais ton code et non ce que tu crois qu'il fait.

    il n'y a qu'une solution tu parcoures tous les membres et dans la boucle tu utilise typeOf et/ou hasOwnProperty pour déterminé comment tu traite le membre.

    Quant à ta conclusion encore une fois tu es à coté de la plaque.
    ton idée de vrais ou fausses propriété est le fruit de ton imagination ça n'existe pas ni en javascript ni dans d'autres langages.
    La règle est que tout est objet les fonction aussi. cela peu ne pas te plaire mais c'est ainsi.
    un objet est une structure qui s'apparente à un tableau clef(string) valeur(objet)
    les fonctions interne de javascript s'applique à cette structure (et ne son pas des valeurs dans la structure
    tous les membres de la structure sont traité de la même façon (pas de discrimination)

    Ce n'est pas parce que tu te fais une fausse idée de ce qu'est le langage qu'il est mal fini. Il est au contraire plutôt cohérent et bien fini. mais il ne corresponds pas à l'idée que tu t'en fais.

    deux façon d'aborder ce genre de situation.
    1. Chercher à en apprendre plus pour comprendre le langage et l'utiliser pour ce qu'il est ou en choisir un autre en connaissance de cause.
    2. Refuser de remettre en question ce qu'on crois être la vérité sur le langage et le critiquer. et continuer à écrire du code faux et pestant que le langage ne fais pas ce qu'on attends de lui.


    A+JYT

  10. #10
    Rédacteur/Modérateur

    Avatar de SylvainPV
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3 375
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3 375
    Points : 9 944
    Points
    9 944
    Par défaut
    Pour définir une propriété non énumérable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Object.defineProperty(o, "message", { 
       enumerable: false, 
       value: function (m){alert(m)}
     })
    One Web to rule them all

Discussions similaires

  1. Dans quel package se trouve les fonctions C ??
    Par red210 dans le forum Linux
    Réponses: 9
    Dernier message: 18/12/2005, 20h16
  2. [plpgsql] transaction dans les fonctions ?
    Par hpghost dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 27/06/2004, 16h56
  3. Réponses: 7
    Dernier message: 24/05/2003, 15h56

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