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] dérivation / classe Array pour IE


Sujet :

JavaScript

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite Avatar de Herode
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2005
    Messages
    825
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2005
    Messages : 825
    Par défaut [POO] dérivation / classe Array pour IE
    Bonjour à tous.
    Soit j'oublie quelque chose d'énorme, soit IE prouve une fois de plus son originalité. Soit une classe HArray dérivée de Array :
    1 - code minimaliste pour HArray :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    HArray.prototype = new Array();
    // @in src = argument facultatif spécifiant un tableau à copier
    function HArray(src) {
    	if( !!src ) this.copy(src);
    }
     
    HArray.prototype.copy = HArray_copy;
    // @in src = tableau à copier
    function HArray_copy(src) {
    g_dbg.addTrace("-------> HArray_copy : src.length = " + src.length)
    	this.splice(0); 
    	if( !!src ) for( var i = 0; i < src.length; ++ i ) this.push(src[i]);
    g_dbg.addTrace("-------> HArray_copy : this.length = " + this.length)
    }
    où g_dbg est une instance (variable globale) d'une classe utilitaire qui enregistre les traces, comme le nom de la méthode l'indique, et les restitue ensuite sur demande. Rien de spécial donc.

    2 - code de test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    	<h1>Vérif IE</h1>
    <script language="javascript"><!--
    function test1() {
    	var out = $dyn($id('HArray_TestIE'));
    	g_dbg.addTrace("test1");
    	var arr = new HArray(new Array(0, 1, 2, 3, 4, 5));
    	for(var i = 0; i < g_dbg.getTraces().length; ++ i ) out.setText(g_dbg.getTraces()[i], true, 'br');
    }
    --></script>
    <div id="HArray_TestIE" style="background-color:#F0F0F0"></div>
    <button onclick="test1()">test1</button>
    out prend un pointeur encapsulé sur le div 'HArray_TestIE', on initialise un HArray et on écrit les traces dans le div.

    Résultat :
    3 - traces sous Firefox et Opera conforme à mes attentes :
    mardi 20 novembre 2007 12:11:25 === test1
    mardi 20 novembre 2007 12:11:25 === -------> HArray_copy : src.length = 6
    mardi 20 novembre 2007 12:11:25 === -------> HArray_copy : this.length = 6
    4 - traces sous IE7 :
    mardi 20 novembre 2007 12:19:17 === test1
    mardi 20 novembre 2007 12:19:17 === -------> HArray_copy : src.length = 6
    mardi 20 novembre 2007 12:19:17 === -------> HArray_copy : this.length = 0


    Conclusion : IE7 ne traite pas correctement Array.push() pour les classes dérivées ???? Avez-vous des éclaircissements là-dessus ou bien est-ce que je fais une grosse bêtise quelque part ? Eventuellement, avez-vous des suggestions pour un wouhorqe heurrahounde ?

  2. #2
    Membre chevronné
    Inscrit en
    Novembre 2006
    Messages
    336
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 336
    Par défaut
    Quel est l'interet de dériver la classe?

  3. #3
    Membre émérite Avatar de Herode
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2005
    Messages
    825
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2005
    Messages : 825
    Par défaut
    Il peut y avoir plusieurs réponses :
    1 - pour le côté pédagogique de l'exercice
    2 - parce que dériver la classe au lieu d'en étendre les propriétés me permet
    a/ surtout sur les classes de librairie, d'éviter les conflits de noms éventuels avec d'autres extensions de la même classe
    b/ en général, de gérer l'instanciation de variétés de classes ad hoc en fonction du contexte (avec une Fabrique, en somme)
    c/ est censé marcher

  4. #4
    Expert confirmé
    Avatar de le_chomeur
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2006
    Messages
    3 653
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 3 653
    Par défaut
    ça ne fera pas avancer le shmilblick mais j'ai lu ton code...
    explication...
    et ton final ...
    j'ai rien compris ^^
    juste que IE ne prend pas en charge l'objet Array() en prototype de fonction ?

    toute mes condoléances

    En même temps moi non plus je n'ai pas trouvé d'intérèt

    bon courage pour la suite

  5. #5
    Membre chevronné
    Inscrit en
    Novembre 2006
    Messages
    336
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 336
    Par défaut
    Citation Envoyé par Herode Voir le message
    Il peut y avoir plusieurs réponses :
    1 - pour le côté pédagogique de l'exercice
    2 - parce que dériver la classe au lieu d'en étendre les propriétés me permet
    a/ surtout sur les classes de librairie, d'éviter les conflits de noms éventuels avec d'autres extensions de la même classe
    b/ en général, de gérer l'instanciation de variétés de classes ad hoc en fonction du contexte (avec une Fabrique, en somme)
    c/ est censé marcher
    Certes mais quand tu proposes un exercice ça à vocation à former pour une utilisation ultérieure.

    Hors faire ça, j'entends dériver une classe existante dans le core du langage, n'a aucun intérêt, d'ailleurs ton code est illisible

    Le fait d'avoir des effets de bord me parait totalement prévisible.

    Je te préconise de faire l'exercice sur un prototype maison et si tu dois vraiment implementer copy d'utiliser un le prototypage d'Array directement.

  6. #6
    Membre émérite Avatar de Herode
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2005
    Messages
    825
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2005
    Messages : 825
    Par défaut
    Il n'y a pas d'effet de bord et affirmer péremptoirement que dériver une classe du Core n'a pas d'intérêt me semble un peu léger, mais ce n'est pas le sujet. Je ne doute pas que tes techniques de programmation soient infiniment supérieures aux misérables miennes, ma question porte cependant sur le "pourquoi ça ne marche pas", et pas sur autre chose. J'ai donné la traduction des méthodes utilisées dans le code. Rien de compliqué pourtant. Pour reformuler ça de manière plus neutre, tu obtiendras le même résultat avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    MyArray.prototype = new Array();
    function MyArray() {}
    var arr = new MyArray();
    arr.push(12);
    alert(arr.length);
    qui donne 1 sous FF ou Opera et 0 sous IE.

    Je répète donc ma question : pourquoi push() ne marche-t-il pas sous IE ?
    Soit c'est (je le suppose) un problème lié à IE, soit il y a une raison liée au langage lui-même et FF/Opera absorbent l'erreur et en ce cas, laquelle. Voilà ce que je cherche à éclaircir.

  7. #7
    Expert confirmé
    Avatar de le_chomeur
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2006
    Messages
    3 653
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 3 653
    Par défaut
    j'ai voulu comprendre pourquoi , m'ai je n'ai toujours pas trouvé ...
    j'ai implémenté ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     function MyArray() {}
      var test = new Array('toto','titi');
      alert(test);
      MyArray.prototype = test;
      var arr = new MyArray();
      alert(arr);
      arr.push(12);
      alert(arr.length);
      </script>
    ce qui nous donne sous FF : 'toto','titi' , 'toto','titi' , 3
    sous IE : 'toto','titi' , [object] , 2

    Selon toute vraisemblance , la classe Array sous ie fait référence a l'objet et non a la classe elle même, donc pas de possibilité de la dérivé sous IE ...

    J'espère avoir éclaircit un peu la situation :$

Discussions similaires

  1. Réponses: 5
    Dernier message: 09/10/2008, 16h40
  2. Réponses: 1
    Dernier message: 30/04/2008, 19h35
  3. [POO] [DEV] Classe de debug pour PHP
    Par -COil- dans le forum Langage
    Réponses: 11
    Dernier message: 09/06/2007, 19h53
  4. [POO] vider un array membre de classe
    Par jlf dans le forum Langage
    Réponses: 2
    Dernier message: 20/10/2005, 10h54
  5. Réponses: 3
    Dernier message: 28/09/2005, 08h39

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