Je me pose la question suivante : quelle est la véritable contrainte qui
obligerait à utiliser des parenthèses, lorsqu'on crée un nouvel objet
alors que le constructeur ne prévoie pas de passage d'arguments ?
Exemple :
<script>
function MyObj() {
this.myProp1 = "Hello";
this.myProp2 = " World!";
}
var newObj1 = new MyObj();
var newObj2 = new MyObj;
alert(newObj1.myProp1 + newObj2.myProp2): // Hello World!
</script>
Curieusement, je n'ai trouvé aucune doc ni tuto qui oserait proposer la
deuxième syntaxe. Pourtant, si elle est tolérée par tous les moteurs de
script, c'est qu'elle a été prévue dans le langage, non ?
Merci,
Pascal
PS: ça marche aussi avec les objets du noyau !
(par exemple : var today = new Date)
> Je me pose la question suivante : quelle est la v�ritable contrainte qui
> obligerait � utiliser des parenth�ses, lorsqu'on cr�e un nouvel objet
> alors que le constructeur ne pr�voie pas de passage d'arguments ?
Le probl�me est de savoir de quel objet tu parles.
var toto = function() { } // cr�ation d'un objet function
var tutu = new toto ; // cr�ation d'un objet tutu prototyp� � partir de
l'objet toto.
> Curieusement, je n'ai trouv� aucune doc ni tuto qui oserait proposer la
> deuxi�me syntaxe. Pourtant, si elle est tol�r�e par tous les moteurs de
> script, c'est qu'elle a �t� pr�vue dans le langage, non ?
La norme ecmascript (javascript est une impl�mentation de javascript)
pr�voit effectivement la syntaxe sans parenth�se avec new, mais la
syntaxe de function requiert les parenth�ses.
--
Micka�l Wolff aka Lupus Michaelis
http://lupusmic.org
Cf. mon exemple.
> var toto = function() { } // création d'un objet function
Forcément, c'est une syntaxe littérale de fonction (anonyme, en plus).
Moi, je parle d'objets créés à partir d'un constructeur avec le mot clé
"new" (l'équivalent des instances de classes, quoi).
> La norme ecmascript (javascript est une implémentation de ECMAScript*)
> prévoit effectivement la syntaxe sans parenthèse avec new, mais la
> syntaxe de function requiert les parenthèses.
(* j'ai corrigé)
Ok, pas de surprise jusque-là (hou ! ça va faire prétentieux, mais je
suis pas vraiment débutant, alors on peut passer qqes étapes).
Bon, je reformule : d'accord, le standard prévoie cette syntaxe, mais
alors pourquoi personne (sauf moi, des fois) ne l'emploie (ou ne montre
qu'il l'emploie dans ses exemples) ? Y a-t-il une contrainte formelle
(des moteurs à la con qui aimeraient pas) ou informelle (une convention
d'écriture héritée de j'sais pas quoi) ?
En tout cas merci pour cette première réponse.
Cordialement,
Pascal
>> var toto = function() { } // cr�ation d'un objet function
>
> Forc�ment, c'est une syntaxe litt�rale de fonction (anonyme, en plus).
> Moi, je parle d'objets cr��s � partir d'un constructeur avec le mot cl�
> "new" (l'�quivalent des instances de classes, quoi).
En Ecmascript, il n'y a que des instances d'objets ;)
> Ok, pas de surprise jusque-l� (hou ! �a va faire pr�tentieux, mais je
> suis pas vraiment d�butant, alors on peut passer qqes �tapes).
>
> Bon, je reformule : d'accord, le standard pr�voie cette syntaxe, mais
> alors pourquoi personne (sauf moi, des fois) ne l'emploie (ou ne montre
> qu'il l'emploie dans ses exemples) ? Y a-t-il une contrainte formelle
> (des moteurs � la con qui aimeraient pas) ou informelle (une convention
> d'�criture h�rit�e de j'sais pas quoi) ?
Moi aussi �vite de mettre des parenth�ses inutiles. Mais �a vient de
mon exp�rience avec le C++ (prise en compte de operator () lorsqu'il n'y
a pas de constructeur par d�faut explicite). Alors, pourquoi tout les
autres mettent des parenth�ses ? Je suppose que c'est en raison de
l'apprentissage. Les tutoriaux ne s'encombrent que rarement la syntaxe
compl�te d'un langage (ce n'est pas leur role). Le probl�me c'est de
rester au niveau des tutoriaux.
> En tout cas merci pour cette premi�re r�ponse.
Il t'en prie !
Ça ferait presque l'objet d'un autre fil, mais je crois que cette
formule est un peu raccourcie, l'ami. ;-)
Sinon :
var str1 = "toto"; // et...
var str2 = new String("toto");
...serait du même type, or ce n'est pas le cas :
var type1 = typeof str1; // 'string'
var type2 = typeof str2; // 'object'
Et pourtant :
var uc1 = str1.toUpperCase(); // et...
var uc2 = str2.toUpperCase();
...donne bien le même résultat, puisque traités comme des objets de même
type auxquels est appliquée la même méthode !
Ce qui prouve que la déclaration de str1 n'a pas créé une instance
d'objet, mais que celle-ci est temporairement créée lorsque nécessaire
(effet du typage dynamique).
Me trompe-je ?
Ce que je voulais exprimer, c'est que dans Ecmascript il n'existe pas
de concept de class, mais uniquement d'objets. Les types de base se
comportant comme des objets.
> Ce qui prouve que la déclaration de str1 n'a pas créé une instance
> d'objet, mais que celle-ci est temporairement créée lorsque nécessaire
> (effet du typage dynamique).
>
> Me trompe-je ?
Je pense que les chaines litérales sont strictement équivalentes aux
objets créés à partir de la propriété String de l'objet hote. Je pense
que l'essentiel est vraiment de ne pas faire de différence, et de
profiter de l'abstraction du langage.
--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org