Différentes façons de créer un objet Javascript?

J'apprends à coder et j'ai une question sur un exemple de code que j'ai trouvé:

var Comment = new Schema({ user:userStub, time:Date, content: {type:String, required: true, trim:true} }); 

D'après ce que j'ai appris sur OOP, je pensais que l'instance d'objet Comment de Schema serait construite comme ceci:

 function Schema (user, time, content){ this.user = user; this.time = time; this.content = content; }; var Comment = new Schema (userStub, time, content); 

Quelqu'un connaît l'avantage de construire l'instance Comment via var Comment = new Schema({ place? Qu'est-ce que le ({ signifie? Toute aide serait grandement appréciée

Le type d'entrée de la fonction constuctor de Schema est dans ce cas un objet, donc la notation {}.

 function Schema (o){ this.user = o.user; this.time = o.time; this.content = o.content; }; 

Un objet est juste une variable comme une chaîne ou un nombre. Donc, vous pouvez le transmettre dans une fonction. Mais au lieu de créer un objet en premier, l'objet d'entrée dans votre exemple est écrit dans l'appel comme celui-ci

 mySchema = new Schema({user:'john'}); 

au lieu de:

 var myObj = {user:'john'}; mySchema = new Schema(myObj); 

Un avantage de le faire de cette façon est que vous pouvez modifier votre fonction sans changer sa signature. Un autre avantage est que si vous avez beaucoup de paramètres d'entrée ne sont pas tous obligatoires, vous ne devez pas ajouter de valeurs par défaut aux paramètres que vous n'utilisez pas. Par exemple:

 var mySchema1 = new Schema({size:25}); var mySchema2 = new Schema({name:'the best schema ever'}); 

Si la signature de la fonction serait:

 function Schema(size,name) { // code here } 

Vous devriez appeler:

 var mySchema2 = new Schema(0,'the best schema ever'); 

Où 0 est la valeur par défaut pour la taille. Vous pouvez imaginer que cela peut être gênant lorsqu'il y a beaucoup de paramètres.

Un avantage de le faire de cette façon est que vous pouvez modifier votre fonction sans changer sa signature. Un autre avantage est que si vous avez beaucoup de paramètres d'entrée ne sont pas tous obligatoires, vous ne devez pas ajouter de valeurs par défaut aux paramètres que vous n'utilisez pas … – @Michiel Reyers

Voici un exemple sur la façon de créer une nouvelle «instance» avec un paramètre Object Literal en tant que paramètre dans la fonction constructeur, en éliminant la liste des paramètres:

 function Schema (options) { "use strict"; options = options || {}; this.user = options.user || "unnamed"; this.time = options.time || null; this.content = options.content || {}; } 

Dans l'approche précédente, nous pouvons créer de nouveaux objets en spécifiant aucun, une ou toutes les propriétés dans le paramètre d'entrée. En plus, la signature du constructeur se maintient inchangé:

 var comment; //no arguments comment = new Schema(); //only one option comment = new Schema({ user: "luis" }); //multiple options comment = new Schema({ user: "Federico", time: new Date(1995, 10 - 1, 31), //october 31, 1995 content: { type: Types.String, required: true, trim: true } }); 

De plus, vous pouvez étendre l'objet, de sorte que la fonction constructeur peut être plus flexible en étendant dans l'instance les nouvelles propriétés dans le paramètre d'entrée. Pour cet exemple, je vais utiliser jQuery (je sais, n'est pas dans la balise), mais vous pouvez créer une méthode personnalisée pour étendre les objets sans jQuery.

 //pointer to the internal Schema var Schema = (function () { //cached default values var defaults = { user: "unnamed", time: null, content: {} }; //constructor extensible function Schema (options) { "use strict"; //merges @options and @defaults into the instance @this jQuery.extend(this, defaults, options); } //returns the reference to Schema; return Schema; }()); 

Nous avons utilisé le modèle Constructor . Vous pouvez utiliser le Schema et ajouter de nouvelles propriétés sans devoir modifier la signature du constructeur. (Voir également MODULE MODULE ).

 var comment = new Schema({ user: "Felipe", age: 31 }); 

Une amélioration par rapport à l'approche précédente consiste à définir les valeurs par défaut dans le prototype du constructeur:

 //pointer to the internal Schema var Schema = (function ($) { //constructor extensible function Schema (options) { "use strict"; //merges @options into the instance @this $.extend(this, options); } //sets the default values Schema.prototype = { "user": "unnamed", "time": null, "content": {} }; //returns the reference to Schema; return Schema; }(jQuery)); var comment = new Schema(); console.log(comment); comment = new Schema({ user: "coco", age: +"d" }); console.log(comment);