Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Comportement bizarre avec with()

14 réponses
Avatar
Pierre Goiffon
Je viens de constater un comportement extrêmement étrange que je ne
comprend pas, je suis donc très preneur d'éclaircissement sur le
pourquoi du comment.
Le code actuel est aussi sans doute largement améliorable... je suis
aussi preneur de tous commentaires.

Soit donc :
- une initialisation de tableau d'objets, dont on a besoin par ailleurs
pour récupérer des données (pas faisable simplement en XHR dans le
contexte réél)
- une fonction qui porte le même nom (LblTutu) qu'une des propriétés de
l'objet dans le tableau

Regardez cette page (test case bien plus simple que la page originale) :
http://pgoiffon.free.fr/_temp/JS-with-prb_NOK.html

Des erreurs JS sont levées car la fonction LblTutu() n'est pas trouvée.

Et ici, déclaration du tableau sans utiliser with() :
http://pgoiffon.free.fr/_temp/JS-with-prb_OK.html
Pas de soucis.

Donc :
- pourquoi ces erreurs JS ?
- existe-t-il un meilleur moyen pour déclarer ce tableau ?

4 réponses

1 2
Avatar
SAM
Francis Spiesser wrote:
- existe-t-il un meilleur moyen pour déclarer ce tableau ?


Tab[0] = {Nomligne:'Alpha', LblTutu:'tutu'};
Tab[1] = {Nomligne:'Bravo', LblTutu:'tutu'};
etc.


Ca me parait très élégant !
Comment est-ce que l'on accédera aux valeurs ensuite ?
Par Tab[0]['Nomligne'] ?


Tab[n].Nomligne
Tab[n].tutu

devraient donner toutes satisfactions ;-)

--
sm



Avatar
Pierre Goiffon
SAM wrote:
YD wrote:
function myObject(nomLigne, lbl){
this.NomLigne=nomLigne?nomLigne:"";
this.LblTutu=lbl?lbl:"";
}


Juste une petite question : je vois une casse différente entre les
paramètres du constructeur et les propriétés de l'objet, est-ce juste
pour un effort de clarté ?


toutafé


OK

En fait la création de classe en JS est un peu floue dans ma tête...
Existe-t-il quelque part une documentation expliquant tout ça ? (je
suppose que c'est un vaste sujet et ainsi il faudrait que je me
documente mais en l'état je ne sais pas trop où)

De ce que je comprend on définit le constructeur et on peut ensuite
rattacher des méthodes ? Il n'y a pas de méthode de déclaration en un
seul endroit de la classe, propriétés et méthodes ?



Avatar
YD
Existe-t-il quelque part une documentation expliquant tout ça ? (je
suppose que c'est un vaste sujet et ainsi il faudrait que je me
documente mais en l'état je ne sais pas trop où)


Pour commencer la doc Javascript de Mozilla me semble un excellent départ :
http://developer.mozilla.org/fr/docs/JavaScript
et puis la Faq de comp.lang.javascript...

De ce que je comprend on définit le constructeur et on peut ensuite
rattacher des méthodes ? Il n'y a pas de méthode de déclaration en un
seul endroit de la classe, propriétés et méthodes ?


Attention en JS il n'existe pas à proprement parler de méthodes, il n'existe que
des propriétés qui peuvent être d'un type de données primitif (chaînes, nombres,
booleéns...) ou des objets (Object et Array ainsi que les objets encapsulant les
type de données primitifs String, Boolean, Number...).

Les méthodes en JS sont donc des propriétés de type Function. Elles peuvent être
ajoutées à l'instance d'objet par le constructeur ou après. Il est parfois plus
intéressant de les ajouter au prototype de la fonction (elles ne sont ainsi pas
recopiées dans chaque instance qui garde cependant la possibilité de surcharger
le prototype). Rattachées au prototype les fonctions deviennent en quelque sorte
des méthodes de classe.

Ajout de "méthodes" par le constructeur :

function myObj(){
this.coucou = function(){alert("Coucou !");}

function ciao(){alert('Ciao!');}
this.ciao=ciao;
}
var anInstance = new myObj();
anInstance.coucou();
anInstance.ciao();

--
Y.D.

Avatar
Pierre Goiffon
[à propos des classes en JS]

YD wrote:
Existe-t-il quelque part une documentation expliquant tout ça ?


Pour commencer la doc Javascript de Mozilla me semble un excellent départ :
http://developer.mozilla.org/fr/docs/JavaScript
et puis la Faq de comp.lang.javascript...
(...)


Merci bcp YD pour les réponses !
Je m'en vais explorer tout ça !

Très cordialement,
P. Goiffon


1 2