Je suis confus sur la manière dont je devrais créer un objet en javascript. Il semble qu'il y ait au moins deux façons. L'une consiste à utiliser la notation littérale d'objet tandis que l'autre utilise des fonctions de construction. Y a-t-il un avantage de l'un sur l'autre?
javascript
chobo
la source
la source
Réponses:
Si vous n'avez pas de comportement associé à un objet (c'est-à-dire si l'objet n'est qu'un conteneur de données / état), j'utiliserais un littéral d'objet.
Appliquez le principe KISS . Si vous n'avez besoin de rien d'autre qu'un simple conteneur de données, optez pour un simple littéral.
Si vous souhaitez ajouter un comportement à votre objet, vous pouvez utiliser un constructeur et ajouter des méthodes à l'objet pendant la construction ou donner à votre classe un prototype.
Une classe comme celle-ci agit également comme un schéma pour votre objet de données: vous avez maintenant une sorte de contrat (via le constructeur) quelles propriétés l'objet initialise / contient. Un littéral gratuit est juste une goutte amorphe de données.
Vous pourriez aussi bien avoir une
verify
fonction externe qui agit sur un ancien objet de données:Cependant, cela n'est pas favorable en ce qui concerne l'encapsulation: idéalement, toutes les données + comportement associé à une entité devraient cohabiter.
la source
this.fn = function ...
approche dans un constructeur, chacune de vos instances d'objet aura ses propres copies de fonctions. En utilisant l'approche prototype, vous attachez chaque fonction une et une seule fois: elles seront héritées par les instances via l'héritage prototypique.Cela revient essentiellement à savoir si vous avez besoin de plusieurs instances de votre objet ou non; objet défini avec un constructeur vous permet d'avoir plusieurs instances de cet objet. Les littéraux d'objet sont essentiellement des singletons avec des variables / méthodes qui sont toutes publiques.
la source
Une autre façon de créer des objets de manière uniforme consiste à utiliser une fonction qui renvoie un objet:
Puisque les fonctions en JavaScript sont des fermetures, nous pouvons utiliser des variables et des méthodes privées et éviter
new
.De http://javascript.crockford.com/private.html sur les variables privées en JavaScript.
la source
Le code ci-dessous montre trois méthodes de création d'un objet, la syntaxe Object Literal, un constructeur de fonction et
Object.create()
. La syntaxe littérale d'objet crée simplement un objet à la volée et en tant que tel,__prototype__
c'est l'Object
objet et il aura accès à toutes les propriétés et méthodes deObject
. Du point de vue du modèle de conception, un simple littéral Object doit être utilisé pour stocker une seule instance de données.Le constructeur de fonction a une propriété spéciale nommée
.prototype
. Cette propriété deviendra la__prototype__
de tous les objets créés par le constructeur de fonction. Toutes les propriétés et méthodes ajoutées à la.prototype
propriété d'un constructeur de fonction seront disponibles pour tous les objets qu'il crée. Un constructeur doit être utilisé si vous avez besoin de plusieurs instances des données ou si vous avez besoin d'un comportement de votre objet. Notez que le constructeur de fonction est également mieux utilisé lorsque vous souhaitez simuler un modèle de développement privé / public. N'oubliez pas de mettre toutes les méthodes partagées sur le.prototype
afin qu'elles ne soient pas créées dans chaque instance d'objet.La création d'objets avec
Object.create()
utilise un objet littéral comme__prototype__
pour les objets créés par cette méthode. Toutes les propriétés et méthodes ajoutées au littéral d'objet seront disponibles pour tous les objets créés à partir de celui-ci via un véritable héritage prototypique. C'est ma méthode préférée.la source
Object.create
l' aide de la fonction à l'intérieur du littéral, il sera unique par instance?Cela dépend de ce que vous voulez faire. Si vous souhaitez utiliser des variables ou des fonctions (semi-) privées dans votre objet, une fonction constructeur est le moyen de le faire. Si votre objet ne contient que des propriétés et des méthodes, un littéral d'objet convient.
Maintenant , la méthode
multiply5
dansmyObj
etSomeLiteral
faire exactement la même chose. La seule différence est que myObj utilise une variable privée. Ce dernier peut être utile dans certains cas. La plupart du temps, un littéral Object est suffisant et constitue une manière agréable et propre de créer un objet JS.la source
Voulez-vous une seule instance de l'objet pour la page - Littéral.
Voulez-vous simplement transférer des données comme des objets DTO simples GET SET: - Literal
Voulez-vous créer des objets réels avec des comportements de méthode, plusieurs instances - Fonction constructeur, Suivez les principes de la POO, héritage: - Fonctions constructeur.
Vous trouverez ci-dessous la vidéo youtube qui explique en détail ce qui est littéral, ce que sont les fonctions du constructeur et en quoi elles diffèrent les unes des autres.
https://www.youtube.com/watch?v=dVoAq2D3n44
la source
Allez avec un objet littéral, c'est plus consise et se développe mieux avec l'introduction de valeurs initiales.
la source
Comme mentionné dans https://www.w3schools.com/js/js_object_definition.asp
Aussi
la source
JavaScript orienté objet Udacity
la source
En fait, je pense que nous pouvons avoir des méthodes privées dans les littéraux d'objet. Considérez le code ci-dessous:
Question de goût, mais je préfère utiliser des objets littéraux là où c'est possible.
la source
// Object Literal et Object constructeur
la source