Estou ficando confuso sobre como devo criar um objeto em javascript. Parece que existem pelo menos duas maneiras. Uma é usar notação literal de objeto enquanto a outra usa funções de construção. Existe uma vantagem de um sobre o outro?
javascript
chobo
fonte
fonte
Respostas:
Se você não tiver um comportamento associado a um objeto (ou seja, se o objeto for apenas um contêiner de dados / estado), eu usaria um literal de objeto.
Aplique o princípio KISS . Se você não precisa de nada além de um simples contêiner de dados, use um literal simples.
Se você deseja adicionar comportamento ao seu objeto, você pode ir com um construtor e adicionar métodos ao objeto durante a construção ou dar a sua classe um protótipo.
Uma classe como essa também atua como um esquema para seu objeto de dados: agora você tem algum tipo de contrato (por meio do construtor) de quais propriedades o objeto inicializa / contém. Um literal livre é apenas uma bolha amorfa de dados.
Você também pode ter uma
verify
função externa que atua em um objeto de dados simples e antigo:No entanto, isso não é favorável com relação ao encapsulamento: Idealmente, todos os dados + comportamento associados a uma entidade devem viver juntos.
fonte
this.fn = function ...
abordagem em um construtor, cada uma das instâncias de seu objeto terá suas próprias cópias de funções. Usando a abordagem de protótipo, você anexa cada função uma vez e apenas uma vez: elas serão herdadas pelas instâncias por meio da herança prototípica.Basicamente, ele se resume a se você precisa ou não de várias instâncias do seu objeto; objeto definido com um construtor permite que você tenha várias instâncias desse objeto. Literais de objeto são basicamente singletons com variáveis / métodos que são todos públicos.
fonte
Outra maneira de criar objetos de maneira uniforme é usar uma função que retorna um objeto:
Uma vez que as funções em JavaScript são encerramentos, podemos usar variáveis e métodos privados e evitar
new
.De http://javascript.crockford.com/private.html em variáveis privadas em JavaScript.
fonte
O código abaixo mostra três métodos de criação de um objeto, sintaxe Object Literal, um Construtor de Função e
Object.create()
. A sintaxe literal do objeto simplesmente cria um objeto em tempo real e, como tal,__prototype__
é oObject
objeto e terá acesso a todas as propriedades e métodos deObject
. Estritamente de uma perspectiva de padrão de projeto, um literal de objeto simples deve ser usado para armazenar uma única instância de dados.O construtor da função tem uma propriedade especial chamada
.prototype
. Esta propriedade se tornará a__prototype__
de qualquer objeto criado pelo construtor da função. Todas as propriedades e métodos adicionados à.prototype
propriedade de um construtor de função estarão disponíveis para todos os objetos que ele cria. Um construtor deve ser usado se você precisar de várias instâncias dos dados ou de comportamento do seu objeto. Observe que o construtor de função também é melhor usado quando você deseja simular um padrão de desenvolvimento privado / público. Lembre-se de colocar todos os métodos compartilhados no.prototype
para que não sejam criados em cada instância do objeto.A criação de objetos com
Object.create()
utiliza um literal de objeto__prototype__
para os objetos criados por este método. Todas as propriedades e métodos adicionados ao literal do objeto estarão disponíveis para todos os objetos criados a partir dele por meio da verdadeira herança prototípica. Este é o meu método preferido.fonte
Object.create
a função dentro do literal, ele será exclusivo por instância?Depende do que você quer fazer. Se você quiser usar variáveis ou funções (semi-) privadas em seu objeto, uma função construtora é a maneira de fazê-lo. Se o seu objeto contém apenas propriedades e métodos, um literal de objeto é adequado.
Agora o método
multiply5
entramyObj
eSomeLiteral
faz exatamente a mesma coisa. A única diferença é que myObj usa uma variável privada. O último pode ser útil em alguns casos. Na maioria das vezes, um literal de objeto é suficiente e uma maneira limpa e agradável de criar um objeto JS.fonte
Você quer uma instância única do objeto para a página - Literal.
Você quer apenas transferir dados como objetos DTO simples GET SET: - Literal
Você deseja criar objetos reais com comportamentos de método, múltiplas instâncias - Função de construtor, Siga os princípios OOP, herança: - Funções de construtor.
Abaixo está o vídeo do youtube que explica em detalhes o que é literal, o que são funções construtoras e como elas diferem umas das outras.
https://www.youtube.com/watch?v=dVoAq2D3n44
fonte
Vá com o literal de objeto, é mais consistente e se expande melhor com a introdução de valores iniciais.
fonte
Conforme mencionado em https://www.w3schools.com/js/js_object_definition.asp
Além disso
fonte
JavaScript orientado a objetos Udacity
fonte
Na verdade, acho que podemos ter métodos privados em literais de objeto. Considere o código abaixo:
É questão de gosto, mas prefiro usar literais de objeto onde for possível.
fonte
// Object Literal e Object constructor
fonte