Différence entre MyClass.prototype = new Object () et MyClass.prototype = Object

Quelqu'un pourrait-il me dire, où, en Javascript, la différence entre

MyClass.prototype = new Object(); //or ... = {} 

et

 MyClass.prototype = Object; 

est? Et s'il n'y a pas de différence dans le résultat, quelle est la meilleure voie pratique?

Vos deux premiers exemples sont complètement équivalents:

 MyClass.prototype = new Object(); // empty object MyClass.prototype = {}; // empty object 

Votre troisième exemple n'est pas valide, car vous affectez au MyClass.prototype une référence au constructeur d' objets , et c'est une fonction, pas un nouvel objet.

Je préfère personnellement la seconde, la syntaxe de l'objet littéral ou initialisateur :

 MyClass.prototype = {prop1: 'value', prop2: 'value2'}; //... MyClass.prototype.foo = 'bar'; MyClass.prototype.method1: function () {/**/}; 

Modifier: En réponse à votre commentaire, un objet vide littéral { } essentiellement équivalent à un new Object() cause de ceci:

La production ObjectLiteral: {} est évaluée comme suit:

  1. Créez un nouvel objet comme si par l'expression nouvel objet ().
  2. Résultat de retour (1).

Pour plus de détails, vérifiez la section 11.1.5 (Initialiseur d'objet) de la spécification de langue ECMAScript (pdf).

Edit: Le troisième exemple ne produira aucune erreur, mais n'est pas bon du tout, par exemple, vous pouvez facilement clobber la fonction du constructeur d'objets si vous prolongez ensuite le MyClass.prototype:

 MyClass.prototype = Object; MyClass.prototype.foo = 'bar'; Object.foo === MyClass.prototype.foo; // true 

Cela dépend d' Object . Si c'est une fonction, vous souhaitez utiliser la new Object() méthode new Object() . S'il s'agit d'une "classe virtuelle" (définie à l'aide d'un Object = {someProperty: someValue} ), vous utilisez la deuxième méthode.

Quelques conseils supplémentaires sur cette page sur l'héritage de prototype en JavaScript

MyClass.prototype.method1: function () {/ ** /};

Correction à ce qui précède: il devrait être

 MyClass.prototype.method1 = function () {/**/}; 

(Notez le signe égal après 'method1').

Le colon n'est utilisé que lorsque la définition de la méthode est elle-même dans une définition d'objet, comme:

 var myObject = {myVar1: 10, myMethod1: function() { /* */};