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

Parenthèses sur nouvel objet

5 réponses
Avatar
Pascal
Bonjour,

Je me pose la question suivante : quelle est la v=E9ritable contrainte qu=
i=20
obligerait =E0 utiliser des parenth=E8ses, lorsqu'on cr=E9e un nouvel obj=
et=20
alors que le constructeur ne pr=E9voie pas de passage d'arguments ?

Exemple :

<script>
function MyObj() {
this.myProp1 =3D "Hello";
this.myProp2 =3D " World!";
}
var newObj1 =3D new MyObj();
var newObj2 =3D new MyObj;
alert(newObj1.myProp1 + newObj2.myProp2): // Hello World!
</script>

Curieusement, je n'ai trouv=E9 aucune doc ni tuto qui oserait proposer la=
=20
deuxi=E8me syntaxe. Pourtant, si elle est tol=E9r=E9e par tous les moteur=
s de=20
script, c'est qu'elle a =E9t=E9 pr=E9vue dans le langage, non ?

Merci,
Pascal


PS: =E7a marche aussi avec les objets du noyau !
(par exemple : var today =3D new Date)

5 réponses

Avatar
Mickaël Wolff
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
Avatar
Pascal
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
Avatar
Mickaël Wolff
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
Avatar
Pascal
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 ?
Avatar
Mickaël Wolff
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