Qual é a diferença entre esta sintaxe baseada em construtor para criar um objeto:
person = new Object()
... e esta sintaxe literal:
person = {
property1 : "Hello"
};
Parece que os dois fazem a mesma coisa, embora o JSLint prefira o uso da notação literal do objeto.
Qual deles é melhor e por quê?
javascript
object
jslint
ectype
fonte
fonte
a = new Object
,a = new Object()
,a = {}
, literal é muito mais simples e alguns testes eu corri um tempo atrás dizem que é mais rápido, compiladores mais recentes podem ter causado a minha declaração é falsa. O mesmo se aplica a matrizes literaisvar
palavra - chave no código do aplicativo para evitar poluir o espaço para nome global e criar a necessidade de procurar além das variáveis no registro atual da pilha.new
é uma convenção que transcende a busca inútil de uma linguagem medíocre. Usenew
porque seu significado é claro. Em 99,9% dos casos, os ganhos de desempenho são irrelevantes.Respostas:
Ambos fazem a mesma coisa (a menos que alguém tenha feito algo incomum), exceto que o seu segundo cria um objeto e adiciona uma propriedade a ele. Mas a notação literal ocupa menos espaço no código fonte. É claramente reconhecível o que está acontecendo; portanto, usando
new Object()
, você está apenas digitando mais e (em teoria, se não for otimizado pelo mecanismo JavaScript), fazendo uma chamada de função desnecessária.Estes
tecnicamente, não faça a mesma coisa. O primeiro apenas cria um objeto. O segundo cria um e atribui uma propriedade. Para que o primeiro seja o mesmo, você precisará de uma segunda etapa para criar e atribuir a propriedade.
O "algo incomum" que alguém poderia fazer seria sombrear ou atribuir ao
Object
global padrão :Nesse caso altamente incomum ,
new Object
falhará, mas{}
funcionará.Na prática, nunca há uma razão para usar
new Object
em vez de{}
(a menos que você tenha feito essa coisa muito incomum).fonte
()
new Object()
não é necessário. (Falando coisinha sobre não obrigatório)Não há diferença para um objeto simples sem métodos, como no seu exemplo. No entanto, há uma grande diferença quando você começa a adicionar métodos ao seu objeto.
Maneira literal:
Maneira do protótipo:
Ambas as formas permitem a criação de instâncias
Obj
como esta:No entanto, com a maneira literal, você carrega uma cópia do
sayHello
método dentro de cada instância de seus objetos. Enquanto que, da maneira do protótipo, o método é definido no protótipo do objeto e compartilhado entre todas as instâncias do objeto. Se você tem muitos objetos ou muitos métodos, a maneira literal pode levar a um desperdício de memória bastante grande.fonte
new Object()
vs{}
para criar objetos vazios.Em JavaScript, podemos declarar um novo objeto vazio de duas maneiras:
Não encontrei nada que sugira que haja alguma diferença significativa com relação à maneira como eles operam nos bastidores (por favor, corrija-me se estiver errado - adoraria saber). No entanto, o segundo método (usando a notação literal do objeto) oferece algumas vantagens.
Considere um novo objeto que contém os membros Name e TelNo. Usando a nova convenção Object (), podemos criá-la assim:
O recurso Expando Properties do JavaScript nos permite criar novos membros dessa maneira em tempo real, e alcançamos o que pretendíamos. No entanto, esse caminho não é muito estruturado ou encapsulado. E se quiséssemos especificar os membros na criação, sem precisar confiar nas propriedades expando e na pós-criação da atribuição?
É aqui que a notação literal do objeto pode ajudar:
Aqui alcançamos o mesmo efeito em uma linha de código e significativamente menos caracteres.
Uma discussão adicional sobre os métodos de construção de objetos acima pode ser encontrada em: JavaScript e Object Oriented Programming (OOP).
E, finalmente, o que dizer do idiota que substituiu Object? Você achou que não era possível? Bem, esse JSFiddle prova o contrário. O uso da notação literal de objeto nos impede de cair em desgraça com esse bufão.
(De http://www.jameswiseman.com/blog/2011/01/19/jslint-messages-use-the-object-literal-notation/ )
fonte
new Object()
devido à possibilidade de algo substituir a função Objeto, você também deve escrever guardas em todo o lugar quando usa ajudantesObject.keys
para garantir que não sejam indefinidos, o que diminui o absurdo. Eu sempre recomendaria que as pessoas usassem a notação literal, mas acho que esse argumento em particular se desfaz quando você pensa nas consequências de pensar dessa maneira.Na minha máquina usando o Node.js, executei o seguinte:
Observe que esta é uma extensão do que é encontrado aqui: Por que arr = [] é mais rápido que arr = new Array?
minha saída foi a seguinte:
tão claramente {} e [] são mais rápidos que usar new para criar objetos / matrizes vazios.
fonte
Todo mundo aqui está falando sobre as semelhanças dos dois. Vou apontar as diferenças.
Usar
new Object()
permite passar outro objeto. O resultado óbvio é que o objeto recém-criado será definido com a mesma referência. Aqui está um código de exemplo:O uso não se limita aos objetos, como nos objetos OOP. Outros tipos também podem ser passados para ele. A função definirá o tipo de acordo. Por exemplo, se passarmos o número 1 para ele, um objeto do tipo número será criado para nós.
O objeto criado usando o método acima (
new Object(1)
) seria convertido em tipo de objeto se uma propriedade fosse adicionada a ele.Se o objeto for uma cópia de uma classe filho de objeto, poderíamos adicionar a propriedade sem a conversão de tipo.
fonte
str
é do tipo,string
portanto você não pode atribuir uma propriedade a ele. jsfiddle.net/grq6hdx7/1var obj = new Object("foo"); typeof obj; obj === "foo" // true
Na verdade, existem várias maneiras de criar objetos em JavaScript. Quando você deseja apenas criar um objeto, não há benefício em criar objetos " baseados em construtores " usando o operador " novo ". É o mesmo que criar um objeto usando a sintaxe " literal de objeto ". Mas os objetos " baseados em construtores " criados com o operador " novo " são de uso incrível quando você pensa em " herança prototípica ". Você não pode manter a cadeia de herança com objetos criados com sintaxe literal. Mas você pode criar uma função de construtor , anexar propriedades e métodos ao seu protótipo."operador, ele retornará um objeto que terá acesso a todos os métodos e propriedades anexados ao protótipo dessa função construtora.
Aqui está um exemplo de criação de um objeto usando a função construtora (consulte a explicação do código na parte inferior):
Agora, você pode criar quantos objetos quiser, instanciando a função de construção Person e todos eles herdarão fullname () dela.
Nota: a palavra-chave " this " se refere a um objeto vazio dentro de uma função construtora e sempre que você cria um novo objeto a partir de Person usando o operador " new ", ele retorna automaticamente um objeto que contém todas as propriedades e métodos anexados à palavra-chave " this " . E esses objetos certamente herdarão os métodos e propriedades anexados ao protótipo da função construtora Person (que é a principal vantagem dessa abordagem).
A propósito, se você deseja obter a mesma funcionalidade com sintaxe " literal de objeto ", teria que criar fullname () em todos os objetos, como abaixo:
Por fim, se você agora perguntar por que devo usar a abordagem da função construtora em vez da abordagem literal do objeto :
*** A herança prototípica permite uma cadeia simples de herança que pode ser imensamente útil e poderosa.
*** Economiza memória ao herdar métodos e propriedades comuns definidos no protótipo de funções do construtor. Caso contrário, você teria que copiá-los repetidamente em todos os objetos.
Espero que isto faça sentido.
fonte
Object.create(<object defined using literal notation>)
ounew Object(<object defined using literal notation>)
criar cadeias de herança, conforme necessário.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
Além disso, de acordo com alguns dos livros de javascript O'Really .... (citado)
Outro motivo para usar literais em oposição ao construtor Object é que não há resolução de escopo. Como é possível que você tenha criado um construtor local com o mesmo nome, o intérprete precisa procurar a cadeia de escopos do local que você está chamando Object () até encontrar o construtor global Object.
fonte
Eu encontrei uma diferença, para ES6 / ES2015. Você não pode retornar um objeto usando a sintaxe da função de seta abreviada, a menos que o rodeie
new Object()
.Isso ocorre porque o compilador está confuso
{}
entre colchetes e pensa quen: i
é um rótulo: statement construto de ; o ponto e vírgula é opcional, portanto, não se queixa.Se você adicionar outra propriedade ao objeto, ele emitirá um erro.
fonte
[1, 2, 3].map(v => { return {n: v}; });
lhe renderá a mesma coisa ...param => return_value
, e a diferença entre usar{}
enew Object()
neste caso.[1, 2, 3].map(v => ({n: v}));
Atualização de 2019
Executei o mesmo código que @rjloura no meu OSX High Sierra 10.13.6, versão 10.13.0, e estes são os resultados
fonte
O uso da memória é diferente se você criar 10 mil instâncias.
new Object()
manterá apenas uma cópia e{}
10 mil cópias.fonte
new
cria um novo objeto. Ambos levam a mesma quantidade de memória.