Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Parenthèses sur nouvel objet

0 views
Skip to first unread message

Pascal

unread,
Nov 21, 2009, 9:04:53 AM11/21/09
to
Bonjour,

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)

Mickaël Wolff

unread,
Nov 21, 2009, 11:51:40 AM11/21/09
to
Pascal a �crit :

> 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

Pascal

unread,
Nov 21, 2009, 1:30:25 PM11/21/09
to
Mickaël Wolff a écrit :
> Le problème est de savoir de quel objet tu parles.

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


Mickaël Wolff

unread,
Nov 22, 2009, 5:13:02 AM11/22/09
to
Pascal a �crit :

>> 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 !

Pascal

unread,
Nov 22, 2009, 8:59:10 AM11/22/09
to
Mickaël Wolff a écrit :

> En Ecmascript, il n'y a que des instances d'objets ;)

Ç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 ?

Mickaël Wolff

unread,
Nov 23, 2009, 6:19:30 AM11/23/09
to
Pascal a écrit :

> Ç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'

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

0 new messages