Parenthèses sur nouvel objet

Le
Pascal
Bonjour,

Je me pose la question suivante : quelle est la véritable contrainte qu=
i
obligerait à utiliser des parenthèses, lorsqu'on crée un nouvel obj=
et
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 moteur=
s 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)
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Mickaël Wolff
Le #20602081
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
Le #20602591
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 ECMAScrip t*)
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
Le #20605321
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 !

--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org
Pascal
Le #20607001
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écessa ire
(effet du typage dynamique).

Me trompe-je ?
Mickaël Wolff
Le #20613271
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
Publicité
Poster une réponse
Anonyme