Jusqu'à présent, j'ai vu trois façons de créer un objet en JavaScript. Quelle est la meilleure façon de créer un objet et pourquoi?
J'ai également vu que dans tous ces exemples, le mot var
- clé n'est pas utilisé avant une propriété - pourquoi? N'est-il pas nécessaire de déclarer var
avant le nom d'une propriété car il a mentionné que les propriétés sont des variables?
Dans la deuxième et la troisième manière, le nom de l'objet est en majuscules alors que dans la première manière le nom de l'objet est en minuscules. Quel cas devons-nous utiliser pour un nom d'objet?
Première manière:
function person(fname, lname, age, eyecolor){
this.firstname = fname;
this.lastname = lname;
this.age = age;
this.eyecolor = eyecolor;
}
myFather = new person("John", "Doe", 50, "blue");
document.write(myFather.firstname + " is " + myFather.age + " years old.");
Deuxième manière:
var Robot = {
metal: "Titanium",
killAllHumans: function(){
alert("Exterminate!");
}
};
Robot.killAllHumans();
Troisième manière - Objets JavaScript utilisant la syntaxe de tableau:
var NewObject = {};
NewObject['property1'] = value;
NewObject['property2'] = value;
NewObject['method'] = function(){ /* function code here */ }
javascript
object
Jamna
la source
la source
var
, s'il vous plaît .. l'omettre les rend globauxObject.create()
:?Réponses:
Il n'y a pas meilleur moyen, cela dépend de votre cas d'utilisation.
Person
(vous devriez commencer le nom par une majuscule) est appelée la fonction constructeur . Ceci est similaire aux classes dans d'autres langages OO.Mise à jour: comme demandé des exemples pour la troisième voie.
Propriétés dépendantes:
Ce qui suit ne fonctionne pas car
this
ne fait pas référence àbook
. Il n'existe aucun moyen d'initialiser une propriété avec des valeurs d'autres propriétés dans un littéral d'objet:à la place, vous pouvez faire:
Noms de propriétés dynamiques:
Si le nom de la propriété est stocké dans une variable ou créé via une expression, vous devez utiliser la notation entre crochets:
la source
...
pour hériter d'un autre objet?Il existe différentes manières de définir une fonction. Il est totalement basé sur vos besoins. Voici les quelques styles: -
Exemples:
Vous pouvez l'essayer sur console, en cas de confusion.
la source
var person
instance à la fin? par exemple, dans le constructeur de fonction, vous pouvez simplement ajoutervar person = new Person("Anand")
. et qu'est-ce qui se passe avec l'utilisation apparemment aléatoire du point-virgule? : PIl n'y a pas de «meilleure façon» de créer un objet. Chaque méthode présente des avantages en fonction de votre cas d'utilisation.
Le modèle de constructeur (une fonction associée au
new
opérateur pour l'invoquer) offre la possibilité d'utiliser l'héritage prototypique, contrairement aux autres méthodes. Donc, si vous voulez l'héritage prototypique, une fonction de constructeur est une bonne solution.Cependant, si vous souhaitez l'héritage prototypique, vous pouvez également l'utiliser
Object.create
, ce qui rend l'héritage plus évident.La création d'un objet littéral (ex:)
var obj = {foo: "bar"};
fonctionne très bien si vous avez toutes les propriétés que vous souhaitez définir au moment de la création.Pour définir les propriétés ultérieurement, la
NewObject.property1
syntaxe est généralement préférable àNewObject['property1']
si vous connaissez le nom de la propriété. Mais ce dernier est utile lorsque vous n'avez pas réellement le nom de la propriété à l'avance (ex:NewObject[someStringVar]
.J'espère que cela t'aides!
la source
Je suppose que cela dépend de ce que vous voulez. Pour les objets simples, je suppose que vous pouvez utiliser les deuxièmes méthodes. Lorsque vos objets deviennent plus grands et que vous prévoyez d'utiliser des objets similaires, je suppose que la première méthode serait meilleure. De cette façon, vous pouvez également l'étendre à l'aide de prototypes.
Exemple:
Je ne suis pas un grand fan de la troisième méthode, mais c'est vraiment utile pour éditer dynamiquement les propriétés, par exemple
var foo='bar'; var bar = someObject[foo];
.la source
Il existe de nombreuses façons de créer vos objets en JavaScript. Utiliser une fonction de constructeur pour créer un objet ou une notation littérale d'objet utilise beaucoup en JavaScript. En créant également une instance d'Object, puis en y ajoutant des propriétés et des méthodes, il existe trois façons courantes de créer des objets en JavaScript.
Fonctions du constructeur
Il existe des fonctions de constructeur intégrées que nous pouvons tous utiliser de temps en temps, comme Date (), Number (), Boolean (), etc., toutes les fonctions de constructeur commencent par une majuscule, en attendant, nous pouvons créer une fonction de constructeur personnalisée en JavaScript comme ça:
et vous pouvez l'invoquer, simplement en utilisant new (), pour créer une nouvelle instance du constructeur, créer quelque chose comme ci-dessous et appeler la fonction constructeur avec des paramètres remplis:
Objets littéraux
L'utilisation de littéraux d'objet est très utilisée dans le cas de la création d'objet en JavaScript, c'est un exemple de création d'un objet simple, vous pouvez attribuer n'importe quoi à vos propriétés d'objet tant qu'elles sont définies:
Prototypage
Après avoir créé un objet, vous pouvez créer un prototype de plus de membres, par exemple en ajoutant de la couleur à notre boîte, nous pouvons le faire:
la source
Alors que beaucoup de gens ici disent qu'il n'y a pas de meilleur moyen de créer des objets, il y a une raison pour laquelle il y a tant de façons de créer des objets en JavaScript, à partir de 2019, et cela a à voir avec la progression de JavaScript au cours des différentes itérations. des versions d'EcmaScript datant de 1997.
Avant ECMAScript 5, il n'y avait que deux façons de créer des objets: la fonction constructeur ou la notation littérale (une meilleure alternative à new Object ()). Avec la notation de fonction constructeur, vous créez un objet qui peut être instancié dans plusieurs instances (avec le nouveau mot-clé), tandis que la notation littérale délivre un seul objet, comme un singleton.
Quelle que soit la méthode que vous utilisez, les objets JavaScript sont simplement des propriétés de paires valeur / clé:
Dans les premières versions de JavaScript, le seul véritable moyen d'imiter l'héritage basé sur les classes était d'utiliser des fonctions de constructeur. la fonction constructeur est une fonction spéciale qui est appelée avec le mot-clé 'new'. Par convention, l'identifiant de la fonction est en majuscule, albiet il n'est pas obligatoire. À l'intérieur du constructeur, nous nous référons au mot-clé «this» pour ajouter des propriétés à l'objet que la fonction constructeur crée implicitement. La fonction constructeur renvoie implicitement le nouvel objet avec les propriétés remplies à la fonction appelante implicitement, sauf si vous utilisez explicitement le mot-clé return et retournez autre chose.
Il y a un problème avec la méthode sayName. En règle générale, dans les langages de programmation basés sur des classes orientées objet, vous utilisez des classes comme usines pour créer des objets. Chaque objet aura ses propres variables d'instance, mais il aura un pointeur vers les méthodes définies dans le plan de classe. Malheureusement, lors de l'utilisation de la fonction constructeur de JavaScript, chaque fois qu'elle est appelée, elle définira une nouvelle propriété sayName sur l'objet nouvellement créé. Ainsi, chaque objet aura sa propre propriété sayName unique. Cela consommera plus de ressources mémoire.
Outre l'augmentation des ressources de mémoire, la définition de méthodes à l'intérieur de la fonction constructeur élimine la possibilité d'héritage. Encore une fois, la méthode sera définie comme une propriété sur l'objet nouvellement créé et aucun autre objet, donc l'héritage ne peut pas fonctionner comme. Par conséquent, JavaScript fournit la chaîne de prototypes comme une forme d'héritage, faisant de JavaScript un langage prototypique.
Si vous avez un parent et qu'un parent partage de nombreuses propriétés d'un enfant, l'enfant doit hériter de ces propriétés. Avant ES5, il était accompli comme suit:
La façon dont nous avons utilisé la chaîne de prototypes ci-dessus a une bizarrerie. Étant donné que le prototype est un lien actif, en modifiant la propriété d'un objet dans la chaîne de prototypes, vous changeriez également la même propriété d'un autre objet. Évidemment, changer la méthode héritée d'un enfant ne devrait pas changer la méthode du parent. Object.create a résolu ce problème en utilisant un polyfill. Ainsi, avec Object.create, vous pouvez modifier en toute sécurité la propriété d'un enfant dans la chaîne de prototypes sans affecter la même propriété du parent dans la chaîne de prototypes.
ECMAScript 5 a introduit Object.create pour résoudre le bogue susmentionné dans la fonction constructeur pour la création d'objets. La méthode Object.create () CRÉE un nouvel objet, en utilisant un objet existant comme prototype de l'objet nouvellement créé. Puisqu'un nouvel objet est créé, vous n'avez plus le problème où la modification de la propriété enfant dans la chaîne prototype modifiera la référence du parent à cette propriété dans la chaîne.
Avant ES6, voici un modèle de création commun pour utiliser les constructeurs de fonctions et Object.create:
Désormais, Object.create, associé à des fonctions de constructeur, a été largement utilisé pour la création et l'héritage d'objets en JavaScript. Cependant, ES6 a introduit le concept de classes, qui sont principalement du sucre syntaxique par rapport à l'héritage basé sur prototype existant de JavaScript. La syntaxe de classe n'introduit pas de nouveau modèle d'héritage orienté objet dans JavaScript. Ainsi, JavaScript reste un langage prototypique.
Les classes ES6 rendent l'héritage beaucoup plus facile. Nous n'avons plus besoin de copier manuellement les fonctions prototypes de la classe parent et de réinitialiser le constructeur de la classe enfant.
Au total, ces 5 stratégies différentes de création d'objets en JavaScript ont coïncidé avec l'évolution du standard EcmaScript.
la source
Dans l'exemple ci-dessus, vous pouvez voir qu'un objet vide a en fait des propriétés.
Ok d'abord voyons quel est le meilleur moyen:
Dans l'exemple ci-dessus, le journal affichera false.
Voyons maintenant pourquoi les autres méthodes de création d'objets sont incorrectes.
Comme vous pouvez le voir ci-dessus, tous les exemples consignent true, ce qui signifie que si vous avez un cas où vous avez une
for in
boucle pour voir si l'objet a une propriété, vous obtiendrez probablement des résultats erronés.Notez que la meilleure façon ce n'est pas facile. Vous devez définir toutes les propriétés de l'objet ligne par ligne. Les autres méthodes sont plus faciles et auront moins de code pour créer un objet mais vous devez être conscient dans certains cas. J'utilise toujours les "autres moyens" au fait et une solution à l'avertissement ci-dessus si vous n'utilisez pas la meilleure méthode est:
la source
Il existe principalement 3 façons de créer des objets -
Le plus simple consiste à utiliser des littéraux d'objet .
Bien que cette méthode soit la plus simple mais présente un inconvénient, c'est-à-dire que si votre objet a un comportement (des fonctions en lui), à l'avenir, si vous voulez y apporter des modifications, vous devrez le changer dans tous les objets .
Donc, dans ce cas, il est préférable d'utiliser les fonctions Factory ou Constructor. (N'importe qui que vous aimez)
Les fonctions d'usine sont les fonctions qui renvoient un objet.
Les fonctions de constructeur sont ces fonctions qui attribuent des propriétés aux objets en utilisant le mot-clé "this" .eg-
la source