begin process at 2012 05 29 20:55:40
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Javascript / DHTML / Ajax

 > 

JavaScript Orienté objet (POO)

 > 

Function & Méthodes

 > 

Problème avec Array.prototype


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Problème avec Array.prototype

mercredi 15 août 2007 à 00:24:07 | Problème avec Array.prototype

Evangun

Bonjour à tous,

La syntaxe Array.prototype me pose un problème !

En l'occurence c'est avec le JSONstringifier ( [ Lien ]) qui comporte cette fonction :
Array.prototype.toJSONString = function () { ... }

Le résultat c'est que tous mes tableaux ont une case en plus, dont le contenu est "toJSONString" !

J'avais eu exactement le même problème en utilisant cette excellent classe où il y avait

function inArray(text)
{
    for (a=0;a<this.length;a++)
    {
        if(this[a] == text)
        {
            return true;
        }
    }
}
Array.prototype.inArray = inArray;


et ça rajoutait une case avec "inArray" à tous mes tableaux.
Arto_8000 disait de rajouter une condition dans les boucles for(i in array) pour zapper la case en question, mais ce n'est pas envisageable comme solution.

Comment faire pour éviter ce problème ? Merci !
mercredi 15 août 2007 à 12:19:35 | Re : Problème avec Array.prototype

the_wwt

Bonjour,
ce n'est pas un problème, c'est la nature même du javascript où tout est tableau.
Ainsi un objet est un tablau...
Pour parcourir un tableau la bonne syntaxe est:
for(var i = 0, length = array.length; i < length; i++){
....
}

Cdlt,
Pierrick
mercredi 15 août 2007 à 14:13:14 | Re : Problème avec Array.prototype

Evangun

Bonjour ! et merci de ta réponse.

Mais j'ai des tableaux associatifs, je suis obligé de les parcourir avec for (i in array) ...

Il doit bien y avoir un moyen de rajouter une méthode à l'objet Array sans rajouter une case à tous les tableaux, non ?

Je ne comprends pas pourquoi il y a ce comportement. En quoi le fait que tout soit un tableau explique que prototype rajoute une case ?

Merci !
mercredi 15 août 2007 à 16:29:44 | Re : Problème avec Array.prototype

the_wwt

Réponse acceptée !
Re,
et bien tu n'as pas le choix, c'est le seul moyen....
Tien voilà ce qu'en dis l'auteur de la librairie prototypejs:

Many JavaScript authors have been misled into using the for.in JavaScript construct to loop over array elements. This kind of code just won't work with Prototype.

You see, the ECMA 262 standard, which defines ECMAScript 3rd edition, supposedly implemented by all major browsers including MSIE, defines numerous methods on Array (§15.4.4), including such nice methods as concat, join, pop and push, to name but a few among the ten methods specified.

This same standard explicitely defines that the for.in construct (§12.6.4) exists to enumerate the properties of the object appearing on the right side of the in keyword. Only properties specifically marked as non-enumerable are ignored by such a loop. By default, the prototype and the length properties are so marked, which prevents you from enumerating over array methods when using for.in. This comfort led developers to use for.in as a shortcut for indexing loops, when it is not its actual purpose.

However, Prototype has no way to mark the methods it adds to Array.prototype as non-enumerable. Therefore, using for.in on arrays when using Prototype will enumerate all extended methods as well, such as those coming from the Enumerable module, and those Prototype puts in the Array namespace (described in this section, and listed further below).

What is a developer to do?

You can revert to vanilla loops:


for(var index = 0; index < myArray.length; ++index) {
var item = myArray[index];
// Your code working on item here...
}

Or you can use iterators, such as each :


myArray.each(function(item) {
// Your code working on item here...
});

This side-effect enforcement of the true purpose of for.in is actually not so much of a burden: as you'll see, most of what you used to loop over arrays for can be concisely done using the new methods provided by Array or the mixed-in Enumerable module. So manual loops should be fairly rare.

A note on performance

Should you have a very large array, using iterators with lexical closures (anonymous functions that you pass to the iterators, that get invoked at every loop iteration), such as each, or relying on repetitive array construction (such as uniq), may yield unsatisfactory performance. In such cases, you're better off writing manual indexing loops, but take care then to cache the length property and use the prefix ++ operator:


// Custom loop with cached length property: maximum full-loop performance on very large arrays!
for(var index = 0, len = myArray.length; index < len; ++index) {
var item = myArray[index];
// Your code working on item here...
}

mercredi 15 août 2007 à 16:56:26 | Re : Problème avec Array.prototype

Evangun

L'explication est absolument parfaite, merci infiniment de m'avoir montré ça !




Cette discussion est classée dans : problème, case, array, prototype, inarray


Répondre à ce message

Sujets en rapport avec ce message

PRoblème en javascript, jeu de pendu [ par Chihiro ] Voilà, j'ai un gros problème dans mon script qui ne marche pas, parce que je suis vraiment nulle en programmation... Est ce que quelqu'un pourrait y j La porté d'un array en javascript [ par maxxcbenny ] Bonjour,Comment faire pour passer un tableau de type array dans une fonction en javascript ?Parce que voici ce que j'ai codé :var montableau=new array problème de lien [ par kylling ] Salut à tous, Je cherche à faire un menu qui contienne dans une case les chapitres et dans celle d'en dessous toute les parties regroupées dans chacu Prototype et Array [ par syndrael ] Bonjour, Dans Script.Aculo.us (dernière version) on peut lire les ajouts dans Array. Comme ceci:Object.extend(Array.prototype, {   _each: function(ite problème de case à cocher [ par ticam85 ] bonjour à tous!j'ai des groupes et pour chaque groupe une liste de cases à cocher (ou cases radio) (correspondant à des permissions) seulement ces cas Problème fonction image [ par gregorybts ] merci beaucoup pour ces explications, j'ai donc fait les corrections mais il semblerai qu'il y ait un problème puisque le alert (i) que j'ai mis dans formulaire dynamique [ par serialgraph ] Un petit probleme avec une liste déroulante contextuelle !!! Je désire créer une liste déroulante qui affiche des informations en fonction d'un choi Problème URL [ par BasicBrain ] Bonjour, Voici mon problème, J'utilise un script afin de reloader ma page sous forme de lien avec des paramètresvoici le script :function reload(Type) Problème avec un array de div et l'attribut className [ par Noursounet ] Bonjour à tous,Je suis en train de développer un objet Multiview tout en javascript et je bute sur un problème qui je pense est lié à IE7. Le principe problème avec des maths [ par matton14 ] Bonjour à tous.Je suis en train de créer des exercices pour mes élèves simplement je rencontre un problème:je veux qu'il calcule avec le PC A = 28 - 7


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 2,699 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales