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:
- Créez un nouvel objet comme si par l'expression nouvel objet ().
- 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() { /* */};