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 :

Object.defineProperty ET IE <= 9


Sujet :

JavaScript

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

    Informations forums :
    Inscription : Septembre 2009
    Messages : 22
    Points : 19
    Points
    19
    Par défaut Object.defineProperty ET IE <= 9
    Bonjour à tous,

    Je reprend un site qui utilise une fonction JS(ci-dessous) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Object.defineProperty(AssociativeArray.prototype, "length", {
    	get: function () {
    		var count = 0;
    		for (var key in this) {
    			if (this.hasOwnProperty(key))
    			count++;
    			}
    		return count;
    		}
    });
    Qui retourne le nombre d'entrée dans un tableau (exemple ci-dessous ) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    marqueurs
    	Object { poi_LrztJQQrtFOJIAk=Ol, poi_XEnqiMflxMZpZZo=Ol}
    Cela fonctionne correctement sous FF, mais d'après ce que j'ai pu lire cela n'est compatible pour IE qu'après la version >= 9, sinon cela retourne une erreur du type :
    Cet objet ne gère pas cette propriété ou cette méthode

    Quelqu'un serait-il si il est possible de mettre un patch pour IE ?
    Je ne suis pas à l'origine du code, éplucher tout le code s’avérait plutôt fastidieux.

    Merci par avance à celui qui pourra m’éclairer.

  2. #2
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 094
    Points : 6 755
    Points
    6 755
    Par défaut
    Le but de ce bout de code est de mettre un propriété length en lecture seule aux objets AssociativeArray, de telle sorte qu'elle renvoie toujours le bon nombre d'éléments lorsqu'elle est consultée.

    Sous IE<9, une telle façon de faire n'est pas possible. Le plus propre serait de passer par une fonction classique qui fera office de getter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    AssocitativeArray.prototype.getLength = function () {
    	var count = 0;
    	for (var key in this) {
    		if (this.hasOwnProperty(key))
    		count++;
    		}
    	return count;
    	};
    }
    Mais cela implique de réécrire tous les passages du code qui utilisent directement length pour leur faire appeler getLength() à la place, et apparemment tu préfères éviter ça.

    J'ai pensé à des rustines à base de setInterval ou try/catch, mais quand on réfléchit bien on se rend compte que ça ne peut pas marcher. Du coup je ne vois pas d'autre solution…

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Août 2004
    Messages
    189
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 189
    Points : 80
    Points
    80
    Par défaut
    Merci de pour votre réponse.
    Je vais tout de même faire le tour du code pour faire les modifs, ça sera plus propre.

    Bien que ce soit 2 manières de faire différentes, par curiosité, connaitrais tu les avantages de l'une ou l'autre de ces méthodes. A part que l'une n'est compatible IE que si >= 9

  4. #4
    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
    Je pense que le principal avantage de defineProperty est le confort d'écriture et le fait de ne pas polluer le scope en devant y déclarer les fonctions getter et setter.

    Pour les bibliothèques, c'est une aubaine. Ils peuvent fournir leurs propres propriétés plutôt que toujours des méthodes. Par exemple, plutôt que la méthode val() de jQuery qui est un setter ou un getter selon si l'on passe un argument ou pas, on pourrait envisager de définir une propriété spéciale comme $value.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    var resultat = calculFoireux(); //oups, mon calculFoireux a renvoyé la valeur undefined
    $("#monChamp").val(resultat); //le code ne renvoie aucune erreur, il est interprété comme un getter et donc le résultat ne change pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    var resultat = calculFoireux(); //oups, mon calculFoireux a renvoyé la valeur undefined
    $("#monChamp").$value = resultat; //ici aucune ambiguité possible, c'est bien un setter

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Août 2004
    Messages
    189
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 189
    Points : 80
    Points
    80
    Par défaut
    Merci pour ces précisions
    Sujet résolu.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Notion de boucles dans Business Object
    Par lionelEIGIP dans le forum Deski
    Réponses: 1
    Dernier message: 08/04/2004, 11h26
  2. Réponses: 2
    Dernier message: 30/01/2004, 14h07
  3. [DDL] "object <table> is in use"
    Par TMuet dans le forum SQL
    Réponses: 4
    Dernier message: 26/01/2004, 10h18
  4. Réponses: 8
    Dernier message: 21/11/2003, 18h38
  5. Comment inserer des donnee de type Large Object !!
    Par josoft dans le forum Requêtes
    Réponses: 4
    Dernier message: 20/07/2003, 11h21

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