Quelle est la différence entre " new Object()` et littéral d'objet de la notation?
Quelle est la différence entre ce constructeur de base de la syntaxe pour la création d'un objet:
person = new Object()
...et cette syntaxe littérale:
person = {
property1 : "Hello"
};
Il semble que les deux font la même chose, bien que JSLint préfère vous utilisez littéral d'objet de notation.
Lequel est le mieux et pourquoi?
- Tout de même:
a = new Object
,a = new Object()
,a = {}
, littérale est beaucoup plus simple et quelques tests, j'ai couru il y a un moment dire que c'est plus rapide, les nouveaux compilateurs peuvent avoir causé ma déclaration fausse. Même s'applique à littérale des tableaux - J'espère que vous déclarez vos variables avec la
var
mot-clé dans le code de votre application pour éviter de polluer l'espace de noms global et la création de la nécessité de regarder au-delà de l'enregistrement en cours dans la pile pour les variables. - hey man, bon conseil. Mais que voulez-vous dire par "l'enregistrement en cours dans la pile"? Si je suis absent quelque chose que j'aimerais savoir c'
- Fondamentalement, à tout moment pendant l'exécution d'un programme, il y a une pile de dossiers ou de blocs. Chaque enregistrement a une liste de variables qui ont été créés dans le champ d'application. En JavaScript, si une expression contient une variable et l'interprète ne peut pas le trouver dans la pile d'enregistrement pour cette portée, il va continuer jusqu'à l'enregistrement suivant jusqu'à ce qu'il trouve la variable. Plus d'infos davidshariff.com/blog/...
- En évitant de JSLint est la première étape pour devenir un bon développeur. À l'aide de
new
est une convention qui transcende l'inutile tatillon d'une médiocre de la langue. Utilisationnew
parce que sa signification est claire. Dans 99,9% des cas, les gains de performance ne sont pas pertinents. - médiocre de la langue selon qui?
Vous devez vous connecter pour publier un commentaire.
Ils font tous les deux la même chose (à moins que quelqu'un fait quelque chose d'inhabituel), d'autres que votre deuxième on crée un objet et ajoute une propriété. Mais la notation littérale prend moins d'espace dans le code source. C'est clairement reconnaissable en tant que ce qui se passe, afin de l'utiliser
new Object()
, vous êtes vraiment juste en tapant plus et (en théorie, si ce n'est optimisé par le moteur JavaScript) faire une fonction inutile d'appel.Ces
techniquement, il n'est pas la même chose. La première crée un objet. La deuxième crée et attribue une propriété. Pour le premier à être le même que vous avez alors besoin d'une deuxième étape, de créer et d'attribuer la propriété.
Le "quelque chose d'inhabituel" que quelqu'un pourrait faire serait de l'ombre ou de céder à la valeur par défaut
Object
global:Dans ce très inhabituel cas,
new Object
échoue mais{}
fonctionne.Dans la pratique, il n'y a pas de raison d'utiliser
new Object
plutôt que{}
(sauf si vous l'avez fait très inhabituel chose).()
new Object()
n'est pas nécessaire. ( parlons pas nécessaire truc)new Object
etObject()
(en l'appelant sans arguments) faire la même chose, d'aussi loin que la 3ème édition spec en 1999 (je n'ai pas essayer de trouver une version plus ancienne).Il n'y a pas de différence pour un objet simple sans méthodes comme dans votre exemple.
Cependant, il y a une grande différence lorsque vous commencez à ajouter des méthodes à votre objet.
Manière littérale:
Prototype:
Deux façons de permettre la création d'instances de
Obj
comme ceci:Cependant, avec la manière littérale, vous apportez une copie de la
sayHello
méthode au sein de chaque instance de vos objets. Alors que, avec le prototype, la méthode est définie dans l'objet prototype et partagée entre toutes les instances de l'objet.Si vous avez beaucoup d'objets ou à un grand nombre de méthodes, la manière littérale peut conduire à d'assez grandes la mémoire des déchets.
new Object()
vs{}
pour créer des objets vides.sayHello(obj)
et nesayHello(foo)
au lieu defoo.sayHello()
.En JavaScript, on peut déclarer un nouvel objet vide de deux façons:
Je n'ai rien trouvé de suggérer qu'il n'y a aucune différence significative de ces deux quant à la façon dont ils fonctionnent en arrière-plan (corrigez-moi si je me trompe – je voudrais bien savoir). Cependant, la deuxième méthode (à l'aide de l'objet de la notation littérale) offre quelques avantages.
Envisager un nouvel objet qui contient le Nom des membres et TelNo. À l'aide de la new Object() de la convention, nous pouvons le créer comme ceci:
La Expando Propriétés fonction de JavaScript nous permet de créer des nouveaux membres de cette façon, à la volée, et nous réalisons ce que prévoyaient. Cependant, cette voie n'est pas très structuré ou encapsulé. Que faire si nous voulions définir les membres lors de la création, sans avoir à compter sur expando propriétés et de l'affectation post-création?
C'est là l'objet de la notation littérale peut aider:
Ici, nous avons réalisé le même effet dans une ligne de code et de manière significative moins de caractères.
Une discussion approfondie à la construction de l'objet des méthodes ci-dessus peuvent être trouvés à: JavaScript et la Programmation Orientée Objet (POO).
Et enfin, quel est l'idiot qui l'emportait sur l'Objet? Avez-vous pense que ce n'était pas possible? Eh bien, cette JSFiddle prouve le contraire. À l'aide de l'objet de la notation littérale nous empêche de tomber sous le coup de cette bouffonnerie.
(À partir de http://www.jameswiseman.com/blog/2011/01/19/jslint-messages-use-the-object-literal-notation/)
new Object()
en raison de la possibilité que quelque chose a remplacé la fonction de l'Objet, vous devez également écrire des gardes de partout lorsque vous utilisez les aides commeObject.keys
pour s'assurer qu'il n'est pas indéfini, qui descend dans l'absurdité. Je serais toujours recommandons l'utilisation de la notation littérale, mais je pense que cet argument tombe à l'eau quand on pense aux conséquences de penser de cette façon.Sur ma machine à l'aide de Node.js, j'ai couru le suivant:
Remarque, c'est une extension de ce que l'on trouve ici: Pourquoi est arr = [] plus vite que d'arr = new Array?
ma sortie a été le suivant:
donc clairement {} et [] sont plus rapides qu'à l'aide de nouveau pour créer des objets vides/tableaux.
Tout le monde parle ici de les similitudes entre les deux. Je vais souligner les différences.
À l'aide de
new Object()
vous permet de passer à un autre objet. Le résultat évident est que l'objet nouvellement créé sera réglé à la même référence. Voici un exemple de code:L'utilisation n'est pas limitée à des objets aussi en programmation orientée objet, les objets. D'autres types pourraient être transmis à trop. La fonction permet de définir le type en conséquence. Par exemple, si nous passons entier 1, un objet de type numéro sera créé pour nous.
L'objet créé à l'aide de la méthode ci-dessus (
new Object(1)
) serait converti en type d'objet si une propriété est ajouté.Si l'objet est une copie d'un enfant de la classe de l'objet, on pourrait ajouter la propriété sans la conversion de type.
str
est de typestring
de sorte que vous ne peut pas attribuer une propriété à elle. jsfiddle.net/grq6hdx7/1var obj = new Object("foo"); typeof obj; obj === "foo" // true
En fait, il existe plusieurs façons de créer des objets en JavaScript. Quand vous voulez juste pour créer un objet, il n'y a aucun avantage de la création de "constructeur à base de" objets à l'aide de "nouveau" de l'opérateur. C'est même que la création d'un objet à l'aide de "littéral d'objet de syntaxe". Mais "constructeur à base de" les objets créés avec "nouveau" opérateur vient d'utilisation incroyable quand vous pensez au sujet de "prototypes héritage". Vous ne pouvez pas maintenir la chaîne d'héritage avec les objets créés avec la syntaxe littérale. Mais vous pouvez créer une fonction constructeur, attacher des propriétés et des méthodes de son prototype. Alors si vous affectez cette fonction constructeur pour toute variable à l'aide de "nouveau" de l'opérateur, il sera de retour un objet qui aura accès à toutes les méthodes et propriétés sont attachées avec le prototype de la fonction constructeur.
Voici un exemple de création d'un objet à l'aide de la fonction constructeur (voir explication du code en bas):
Maintenant, vous pouvez créer autant d'objets que vous le souhaitez par l'instanciation de Personne en fonction de construction et chacun d'eux sera hériter fullname() de celui-ci.
Note:
"ce mot clé" fera référence à un objet vide à l'intérieur d'une fonction constructeur et chaque fois que vous créez un nouvel objet, d'une Personne à l'aide de "nouveau" de l'opérateur, il retourne un objet contenant toutes les propriétés et méthodes associées à la "ce" mot-clé. Et ces objets va hériter des méthodes et des propriétés qui y sont attachés avec la prototype de la Personne en fonction de constructeur (ce qui est le principal avantage de cette approche).
Par la manière, si vous voulez obtenir la même fonctionnalité avec "littéral d'objet" syntaxe, vous devez le créer fullname() sur tous les objets comme ci-dessous:
Enfin, si vous demandez maintenant pourquoi devrais-je utiliser fonction constructeur approche au lieu de littéral d'objet approche:
*** Prototypes héritage permet à une simple chaîne de l'héritage qui peut être extrêmement utile et puissant.
*** Il permet d'économiser la mémoire en héritant commun des méthodes et des propriétés définies dans les fonctions constructeur de prototype. Sinon, vous devez copier encore et encore dans tous les objets.
J'espère que cela a du sens.
Object.create(<object defined using literal notation>)
ounew Object(<object defined using literal notation>)
et de créer de l'héritage des chaînes en tant que de besoin.function Person(firstname, lastname) { this.firstname = firstname; this.lastname = lastname; } Person.prototype.fullname = function() { console.log(this.firstname + ' ' + this.lastname); } var zubaer = new Person('Zubaer', 'Ahammed'); var john = new Person('John', 'Doe'); zubaer.fullname(); // Zubaer Ahammed john.fullname(); // John Doe zubaer.constructor.prototype.fullname = function() { console.log( 'Hello ' + this.firstname); } zubaer.fullname(); // Hello Zubaer john.fullname(); // Hoello John
Aussi, selon certains O'Really javascript, des livres....(cité)
Une autre raison pour l'utilisation de littéraux contrairement au constructeur de l'Objet est qu'il n'existe pas de résolution de portée. Car il est possible que vous avez créé un constructeur local avec le même nom, l'interprète doit rechercher le champ d'application de la chaîne à partir de l'endroit que vous appelez Objet() tout le chemin jusqu'à ce qu'il trouve l'Objet global constructeur.
J'ai trouvé une différence, pour ES6/ES2015. Vous ne pouvez pas retourner un objet en utilisant le raccourci flèche syntaxe de la fonction, sauf si vous entourer l'objet avec
new Object()
.C'est parce que le compilateur est confondu par le
{}
crochets et pensen: i
est un étiquette: déclaration construire; le point-virgule est facultative afin de ne pas se plaindre à ce sujet.Si vous ajoutez une autre propriété de l'objet qu'il va enfin lever une erreur.
[1, 2, 3].map(v => { return {n: v}; });
vous net la même chose...param => return_value
, et la différence entre l'utilisation de{}
etnew Object()
dans ce cas.[1, 2, 3].map(v => ({n: v}));
2019 mise à Jour
J'ai couru le même code que @rjloura sur mon OSX High Sierra 10.13.6 nœud version 10.13.0 et ce sont les résultats
L'utilisation de la mémoire est différente si vous créez 10 mille instances.
new Object()
ne garder qu'un seul exemplaire alors que{}
conservera 10 mille exemplaires.new
crée un nouvel objet. Ils ont tous deux prendre la même quantité de mémoire.