Até agora, vi três maneiras de criar um objeto em JavaScript. Qual o melhor caminho para criar um objeto e por quê?
Também vi que em todos esses exemplos a palavra var
- chave não é usada antes de uma propriedade - por quê? Não é necessário declarar var
antes do nome de uma propriedade, pois mencionou que propriedades são variáveis?
Na segunda e na terceira maneira, o nome do objeto está em letras maiúsculas, enquanto, na primeira maneira, o nome do objeto está em letras minúsculas. Que caso devemos usar para o nome de um objeto?
Primeira maneira:
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.");
Segunda maneira:
var Robot = {
metal: "Titanium",
killAllHumans: function(){
alert("Exterminate!");
}
};
Robot.killAllHumans();
Terceira maneira - objetos JavaScript usando sintaxe de matriz:
var NewObject = {};
NewObject['property1'] = value;
NewObject['property2'] = value;
NewObject['method'] = function(){ /* function code here */ }
javascript
object
Jamna
fonte
fonte
var
, por favor .. omitindo que os torna mundialObject.create()
:?Respostas:
Não há melhor maneira, depende do seu caso de uso.
Person
(você deve iniciar o nome com uma letra maiúscula) é chamada de função construtora . Isso é semelhante às classes em outros idiomas OO.Atualização: Como exemplos solicitados pela terceira maneira.
Propriedades dependentes:
O seguinte não funciona como
this
não se referebook
. Não há como inicializar uma propriedade com valores de outras propriedades em um literal de objeto:em vez disso, você pode fazer:
Nomes de propriedades dinâmicas:
Se o nome da propriedade estiver armazenado em alguma variável ou criado por meio de alguma expressão, você precisará usar a notação de colchete:
fonte
...
para herdar de outro objeto?Há várias maneiras de definir uma função. É totalmente baseado em sua exigência. Abaixo estão alguns estilos: -
Exemplos:
Você pode experimentá-lo no console, se tiver alguma confusão.
fonte
var person
instância no final? por exemplo, no construtor de funções, você pode simplesmente adicionarvar person = new Person("Anand")
. e o que há com o uso aparentemente aleatório de ponto e vírgula? : PNão há "melhor maneira" de criar um objeto. Cada maneira tem benefícios, dependendo do seu caso de uso.
O padrão do construtor (uma função emparelhada com o
new
operador para invocá-lo) fornece a possibilidade de usar herança prototípica, enquanto as outras formas não. Portanto, se você deseja uma herança prototípica, uma função construtora é um bom caminho a percorrer.No entanto, se você deseja uma herança prototípica, use também o
Object.create
que torna a herança mais óbvia.Criar um literal de objeto (ex:)
var obj = {foo: "bar"};
funciona muito bem se você tiver todas as propriedades que deseja definir em mãos no momento da criação.Para definir propriedades posteriormente, a
NewObject.property1
sintaxe geralmente é preferívelNewObject['property1']
se você souber o nome da propriedade. Mas o último é útil quando você não tem o nome da propriedade antes do tempo (ex:)NewObject[someStringVar]
.Espero que isto ajude!
fonte
Eu acho que depende do que você quer. Para objetos simples, acho que você poderia usar os segundos métodos. Quando seus objetos crescem e você planeja usar objetos semelhantes, acho que o primeiro método seria melhor. Dessa forma, você também pode estendê-lo usando protótipos.
Exemplo:
Não sou muito fã do terceiro método, mas é realmente útil para editar propriedades dinamicamente, por exemplo
var foo='bar'; var bar = someObject[foo];
.fonte
Existem várias maneiras de criar seus objetos em JavaScript. O uso de uma função construtora para criar um objeto ou notação literal de objeto está usando muito em JavaScript. Também criando uma instância do Object e adicionando propriedades e métodos a ela, existem três maneiras comuns de criar objetos em JavaScript.
Funções construtoras
Existem funções construtoras incorporadas que todos nós podemos usá-las periodicamente, como Date (), Number (), Boolean () etc, todas as funções construtoras começam com letra maiúscula, enquanto isso, podemos criar uma função construtora personalizada em JavaScript como isso:
e você pode invocá-lo, simplesmente usando new (), para criar uma nova instância do construtor, criar algo como abaixo e chamar a função construtora com parâmetros preenchidos:
Literais de objeto
O uso de literais de objeto é um caso muito usado para criar objetos em JavaScript; este é um exemplo de criação de um objeto simples; você pode atribuir qualquer coisa às suas propriedades, desde que definidas:
Prototipagem
Depois de criar um Objeto, você pode criar um protótipo de mais membros, por exemplo, adicionando cores à nossa Caixa, podemos fazer isso:
fonte
Embora muitas pessoas aqui digam que não há melhor maneira de criar objetos, há uma justificativa para o motivo de haver tantas maneiras de criar objetos em JavaScript, a partir de 2019, e isso tem a ver com o progresso do JavaScript nas diferentes iterações dos lançamentos EcmaScript desde 1997.
Antes do ECMAScript 5, havia apenas duas maneiras de criar objetos: a função construtora ou a notação literal (uma alternativa melhor ao novo Object ()). Com a notação da função construtora, você cria um objeto que pode ser instanciado em várias instâncias (com a nova palavra-chave), enquanto a notação literal entrega um único objeto, como um singleton.
Independentemente do método usado, os objetos JavaScript são simplesmente propriedades de pares de valores-chave:
Nas versões anteriores do JavaScript, a única maneira real de imitar a herança baseada em classes era usar funções de construtor. a função construtora é uma função especial que é chamada com a palavra-chave 'new'. Por convenção, o identificador da função é maiúsculo, embora não seja necessário. Dentro do construtor, nos referimos à palavra-chave 'this' para adicionar propriedades ao objeto que a função construtora está criando implicitamente. A função construtora retorna implicitamente o novo objeto com as propriedades preenchidas de volta à função de chamada implicitamente, a menos que você use explicitamente a palavra-chave return e retorne outra coisa.
Há um problema com o método sayName. Normalmente, nas linguagens de programação baseadas em classes orientadas a objetos, você usa classes como fábricas para criar objetos. Cada objeto terá suas próprias variáveis de instância, mas terá um ponteiro para os métodos definidos no blueprint da classe. Infelizmente, ao usar a função construtora do JavaScript, toda vez que é chamada, ela define uma nova propriedade sayName no objeto recém-criado. Portanto, cada objeto terá sua própria propriedade sayName exclusiva. Isso consumirá mais recursos de memória.
Além do aumento dos recursos de memória, a definição de métodos dentro da função do construtor elimina a possibilidade de herança. Novamente, o método será definido como uma propriedade no objeto recém-criado e em nenhum outro objeto; portanto, a herança não pode funcionar como. Portanto, o JavaScript fornece a cadeia de protótipos como uma forma de herança, tornando o JavaScript uma linguagem prototípica.
Se você tem um pai e um pai compartilha muitas propriedades de um filho, ele deve herdar essas propriedades. Antes do ES5, era realizado da seguinte maneira:
A maneira como utilizamos a cadeia de protótipos acima tem uma peculiaridade. Como o protótipo é um link ativo, alterando a propriedade de um objeto na cadeia de protótipos, você também alteraria a mesma propriedade de outro objeto. Obviamente, alterar o método herdado de uma criança não deve alterar o método dos pais. O Object.create resolveu esse problema usando um polyfill. Assim, com Object.create, você pode modificar com segurança a propriedade de uma criança na cadeia de protótipos sem afetar a mesma propriedade do pai na cadeia de protótipos.
O ECMAScript 5 introduziu o Object.create para resolver o erro mencionado anteriormente na função construtora para criação de objetos. O método Object.create () cria um novo objeto, usando um objeto existente como o protótipo do objeto recém-criado. Como um novo objeto é criado, você não tem mais o problema de que a modificação da propriedade filho na cadeia de protótipos modificará a referência do pai para essa propriedade na cadeia.
Antes do ES6, havia um padrão criacional comum para utilizar construtores de funções e Object.create:
Agora Object.create, juntamente com funções de construtor, têm sido amplamente utilizados para criação e herança de objetos em JavaScript. No entanto, o ES6 introduziu o conceito de classes, que são principalmente açúcar sintático sobre a herança baseada em protótipo existente do JavaScript. A sintaxe da classe não introduz um novo modelo de herança orientada a objetos ao JavaScript. Assim, o JavaScript continua sendo uma linguagem prototípica.
As classes ES6 tornam a herança muito mais fácil. Não precisamos mais copiar manualmente as funções de protótipo da classe pai e redefinir o construtor da classe filha.
Ao todo, essas 5 estratégias diferentes de Criação de Objetos em JavaScript coincidiram com a evolução do padrão EcmaScript.
fonte
No exemplo acima, você pode ver que um objeto vazio realmente possui propriedades.
Ok, primeiro vamos ver qual é a melhor maneira:
No exemplo acima, o log produzirá false.
Agora vamos ver por que as outras formas de criação de objetos estão incorretas.
Como você pode ver acima, todos os exemplos são verdadeiros. O que significa que, se você tiver um caso, um
for in
loop para ver se o objeto tem uma propriedade provavelmente levará a resultados errados.Observe que a melhor maneira não é fácil. Você precisa definir todas as propriedades do objeto linha por linha. As outras maneiras são mais fáceis e terão menos código para criar um objeto, mas você deve estar ciente em alguns casos. Eu sempre uso as "outras maneiras" a propósito e uma solução para o aviso acima se você não usar a melhor maneira é:
fonte
Principalmente, existem três maneiras de criar objetos -
O mais simples é usar literais de objetos .
Embora este método seja o mais simples, mas tenha uma desvantagem, ou seja, se o seu objeto tiver comportamento (funciona nele), no futuro, se você quiser fazer alguma alteração, precisará alterá-lo em todos os objetos .
Portanto, nesse caso, é melhor usar as funções de fábrica ou de construtor (qualquer pessoa que você gosta)
Funções de fábrica são aquelas funções que retornam um objeto.
Funções de construtor são aquelas funções que atribuem propriedades a objetos usando a palavra-chave "this".
fonte